file serialport.readchar类中serialport.readchar方法只可以用char类型数组接收吗

当前位置: →
→ JNI探秘-----FileInputStream的read方法详解
JNI探秘-----FileInputStream的read方法详解
& 作者及来源: 左潇龙 - 博客园 &
&收藏到→_→:
摘要: JNI探秘-----FileInputStream的read方法详解
"JNI探秘-----FileInputStream的read方法详解"::
& & & & & & &&作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可。
& & & & & & &上一章我们已经分析过fileinputstream的构建过程,接下来我们就来看一下read方法的读取过程。
& & & & & & &我们先来看下fileinputstream中的四个有关read的方法的源码,如下。
public native int read() throws
private native int readbytes(byte b[], int off, int len) throws
public int read(byte b[]) throws ioexception {
return readbytes(b, 0, b.length);
public int read(byte b[], int off, int len) throws ioexception {
return readbytes(b, off, len);
& & & & & & &可以看到,其中有两个本地方法,两个不是本地方法,但是还是内部还是调用的本地方法,那么我们研究的重点就是这两个本地方法到底是如何实现的。
& & & & & & &下面是这两个本地方法的源码,非常简单,各位请看。
jniexport jint jnicall
java_java_io_fileinputstream_read(jnienv *env, jobject this) {
return readsingle(env, this, fis_fd);//每一个本地的实例方法默认的两个参数,jni环境与对象的实例
jniexport jint jnicall
java_java_io_fileinputstream_readbytes(jnienv *env, jobject this,
jbytearray bytes, jint off, jint len) {//除了前两个参数,后三个就是readbytes方法传递进来的,字节数组、起始位置、长度三个参数
return readbytes(env, this, bytes, off, len, fis_fd);
& & & & & & &可以看到,这两个本地方法的实现只是将任务又转给了两个方法,readsingle和readbytes,请注意,在调用这两个方法时,除了常用的env和this对象,以及从java环境传过来的参数之外,还多了一个参数fis_fd,这个对象就是上一章中fileinputstream类中的fd属性的地址偏移量了。
& & & & & & &那么下面我们首先来看readsingle方法的实现,如下。
env和this参数就不再解释了
fid就是fileinputstream类中fd属性的地址偏移量
通过fid和this实例可以获取fileinputstream类中fd属性的内存地址
readsingle(jnienv *env, jobject this, jfieldid fid) {
//存储读取后返回的结果值
char//存储读取出来的字符
fd fd = get_fd(this, fid);//这个获取到的fd其实就是之前handle属性的值,也就是文件的句柄
if (fd == -1) {
jnu_throwioexception(env, "stream closed");
return -1;//如果文件句柄等于-1,说明文件流已关闭
nread = (jint)io_read(fd, &ret, 1);//读取一个字符,并且赋给ret变量
//以下根据返回的int值判断读取的结果
if (nread == 0) { /* eof */
return -1;//代表流已到末尾,返回-1
} else if (nread == jvm_io_err) { /* error */
jnu_throwioexceptionwithlasterror(env, "read error");//io错误
} else if (nread == jvm_io_intr) {
jnu_throwbyname(env, "java/io/interruptedioexception", null);//被打断
return ret & 0xff;//与0xff做按位的与运算,去除高于8位bit的位
& & & & &可以看到,这个方法其实最关键的就是io_read这个宏定义的处理,而io_read其实只是代表了一个方法名称叫handleread,我们去看一下handleread的源码。
fd就是handle属性的值
buf是收取读取内容的数组
len是读取的长度,可以看到,这个参数传进来的是1
函数返回的值代表的是实际读取的字此文来自: 马开东博客
转载请注明出处 网址:
handleread(jlong fd, void *buf, jint len)
dword read = 0;
bool result = 0;
handle h = (handle)
if (h == invalid_handle_value) {//如果句柄是无效的,则返回-1
return -1;
//这里readfile又是一个现有的函数,和上一章的createfile是一样的
//都是win api的函数,可以它的作用与参数详解,理解它并不难
result = readfile(h,
/* file handle to read */
//文件句柄
/* address to put data */
//存放数据的地址
/* number of bytes to read */
//要读取的长度
/* number of bytes read */
//实际读取的长度
/* no overlapped struct */
//只有对文件进行重叠操作时才需要传值
if (result == 0) {//如果没读取出来东西,则判断是到了文件末尾返回0,还是报错了返回-1
int error = getlasterror();
if (error == error_broken_pipe) {
return 0; /* eof */
return -1;
& & & & &到此,基本上就完全看完了无参数的read方法的源码,它的原理其实很简单,就是利用handle这个句柄,使用readfile的win api函数读取了一个字符,不过值得注意的是,这些都是windows系统下的实现方式,所以不可认为这些源码代表了所有系统下的情况。
& & & & &然而对于带有参数的read方法,其原理与无参read方法是一样的,而且最终也是调用的handleread这个方法,只是读取的长度不再是1而已。
& & & & &由此可以看出,文件输入流只是已只读方式打开了一个文件流,而且这个文件流只能依次向后读取,因为在之前的系列装饰器模式一文中,lz已经提到过,对于fileinputstream进行包装而支持回退,标记重置等操作的输入流,都只是在内存里创建缓冲区造成的假象,我们真正的文件输入流是不支持这些操作的。
& & & & &好了,有关fileinputstream的源码内容就分享到此了,如果有兴趣的猿友,可以继续看一下其它的本地方法是如何实现的。
& & & & &感谢各位的收看。
搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
JNI探秘-----FileInputStream的read方法详解_博客园相关文章
博客园_总排行榜
博客园_最新
博客园_月排行榜
博客园_周排行榜
博客园_日排行榜QFile类参考
QFile类是一个操作文件的输入/输出设备。
#include &&
( const&QString&&&name )
( const&QString&&&name )
typedef QCString&(*&&)&(&const&QString&&&fileName&)
typedef QString&(*&&)&(&const&QCString&&&localfileName&)
virtual bool
( int&m, FILE&*&f )
( int&m, int&f )
virtual void
virtual void
virtual Offset
virtual Offset
virtual bool
( Offset&pos )
virtual bool
virtual Q_LONG
( char&*&p, Q_ULONG&len )
virtual Q_LONG
( char&*&p, Q_ULONG&maxlen )
( QString&&&s, Q_ULONG&maxlen )
virtual int
virtual int
( int&ch )
virtual int
( int&ch )
静态公有成员
( const&QString&&&fileName )
( const&QCString&&&localFileName )
( EncoderFn&f )
( DecoderFn&f )
( const&QString&&&fileName )
( const&QString&&&fileName )
重要的继承成员
virtual QByteArray
QFile类是一个操作文件的输入/输出设备。
QFile是用来读写二进制文件和文本文件的输入/输出设备。QFile可以自己单独被使用,但是如果和或一起使用将更加方便。
文件名通常可以通过构造函数来传递,但也可以使用()来设置。你可以通过()来检查一个文件是否存在并且可以通过()来移去一个文件。
文件可以用()来打开、用()来关闭、用()来刷新。数据通常可以使用QDataStream或者QTextStream进行读写,但你也可以使用()和()来读,使用()来写。QFile也支持()、 ()和()。
()可以返回文件的大小。你可以通过使用()函数得到当前文件位置或者移到一个新的文件位置。如果你到了文件的末尾,()返回真。()返回文件句柄。
这里是一个使用来一行一行地读取一个文本文件的代码段。它会把每一行带上一个行号打印出来。
QFile file( "file.txt" );
if ( file.( IO_ReadOnly ) ) {
stream( &file );
int n = 1;
while ( !stream.() ) {
line = stream.(); // 不包括“\n”的一行文本
printf( "%3d: %s\n", n++, line.() );
写文本也很容易(假设我们有一个行的字符串列表要写):
QFile file( "file.txt" );
if ( file.( IO_WriteOnly ) ) {
stream( &file );
for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it )
stream && *it && "\n";
类控制文件的详细信息,比如访问权限、文件日期和文件类型。
类管理目录和文件名列表。
Qt使用Unicode文件名。如果你想在Unix系统上使用你自己的输入/输出,你可以使用()(和())来把文件名转换为本地编码。
也可以参考、和。
成员类型文档
QFile::DecoderFn
被()使用。
QFile::EncoderFn
被()使用。
成员函数文档
QFile::QFile ()
构造一个没有名称的QFile。
QFile::QFile ( const&&&&name )
构造一个文件名为name的QFile。
也可以参考()。
QFile::~QFile ()
析构QFile。调用()。
bool QFile::at ( &pos ) [虚]
设置文件索引到pos。如果成功,返回真,否则返回假。
QFile f( "data.bin" );
// 索引设置为0
f.( 100 );
// 设置索引为100
f.( f.()+50 );
// 设置索引为150
f.( f.()-80 );
// 设置索引为EOF之前的80
不带参数使用()可以重新得到文件的位移。
警告:如果文件是使用方式打开(())的话,结果是未定义的。
也可以参考()和()。
从中重新实现的。
QFile::at () const [虚]
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
返回文件中的位置。
也可以参考()。
从中重新实现的。
bool QFile::atEnd () const [虚]
如果到达文件的末尾,返回真,否则返回假。
也可以参考()。
从中重新实现的。
void QFile::close () [虚]
关闭一个打开的文件。
如果一个文件是使用一个存在的文件句柄打开的,那么它不是关闭的。如果这个存在的文件句柄是一个FILE*,这个文件被刷新。如果这个存在的文件句柄是一个int文件描述符,那么对这个文件将没有操作。
一些“在后面写的”文件系统也许会在关闭文件时报告一个未详细说明的错误。这些错误只表明在上一次打开(())之后也许发生了一些错误。在这种情况下,()会在关闭之后(())报告,否则是。
也可以参考()和()。
实例:、、、、、和。
从中重新实现的。
QFile::decodeName ( const&&&&localFileName ) [静态]
这个将会使用localFileName做与()相反的操作。
也可以参考()。
QFile::encodeName ( const&&&&fileName ) [静态]
当你使用QFile时,在Qt中和访问文件系统,你可以使用Unicode文件名。在Unix上,这些文件名被转换为8位的编码。如果你想在Unix上使用你自己的文件输入/输出,你应该使用这个函数来转换文件名。在Windows NT上,Unicode文件名在文件系统中是直接被支持的并且这个函数应该避免使用。在Windows 95上,在这时候非Latin1的场所设置是不被支持的。
默认情况下,这个函数把fileName转换为本地的8位编码,这取决于用户的场所设置。对于用户选择的文件名这足够了。应用程序中的文件名硬编码只是需要使用7位ASCII文件名字符。
这种转换方案可以使用()来改变。如果你需要给用户一个存储文件名为utf-8等等情况下,这也许很有用,但是这些文件名可能在这之后对其它应用程序来说是不可识别的。
也可以参考()。
bool QFile::exists ( const&&&&fileName ) [静态]
如果给定的文件fileName存在,返回真,否则返回假。
实例:、和。
bool QFile::exists () const
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
如果这个文件存在,返回真,否则返回假。
也可以参考()。
void QFile::flush () [虚]
刷新文件缓存到磁盘。
()也刷新文件缓存。
从中重新实现的。
int QFile::getch () [虚]
从文件中读取一个单字节/字符。
返回所读的字节/字符,如果到达文件的末尾,返回-1。
也可以参考()和()。
从中重新实现的。
int QFile::handle () const
返回这个文件的文件句柄。
如果是一个小的正整数,可以用在像fdopen()和fcntl()这样的C库函数中,也可以用在中。
如果这个文件没有被打开或者存在错误,()返回-1。
也可以参考。
QFile::name () const
返回由()设置的名称。
也可以参考()和()。
bool QFile::open ( int&m ) [虚]
使用m模式和当前指定的文件名打开文件。如果成功,返回真,否则返回假。
模式参数m必须是下列标记的组合:
指定直接的(非缓存的)文件访问。
以只读模式打开文件。
以只写模式(并且截短)打开文件。
以读/写模式打开文件,等于(IO_ReadOnly | IO_WriteOnly)。
以附加的模式打开文件。当你想向日志文件写些东西时这个模式非常有用。文件索引被设置到文件末尾。注意如果你在附加模式中使用()定位文件索引,结果将是为定义的。
截短文件。
在MS-DOS、Windows和OS/2下对文本文件翻译回车和换行。
直接访问模式在输入/输出的块操作使用4千字节或更大的情况下使用最好。当每次读小量数据时,缓存访问工作的更好。
重要:当使用缓存的文件工作时,数据没有被立刻写到文件中。调用()可以确保数据被真正地写完。
警告:如果你有一个缓存文件以同时读写方式打开,你不要在一次输入操作之后立即输出,反之亦然。你必须在输入和输出操作之间调用flush()或者一次文件定位操作,比如seek(),否则缓存中可能会包含无用信息。
如果文件不存在并且指定或时,文件被创建。
QFile f1( "/tmp/data.bin" );
QFile f2( "readme.txt" );
f1.( IO_Raw | IO_ReadWrite | IO_Append );
f2.( IO_ReadOnly | IO_Translate );
也可以参考()、 ()、()和()。
实例:、、、、、和。
从中重新实现的。
bool QFile::open ( int&m, FILE&*&f )
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
使用m模式和一个存在的文件句柄f打开文件。如果成功,返回真,否则返回假。
#include &stdio.h&
void printError( const char* msg )
f.( , stderr );
f.( msg, qstrlen(msg) );
// 写到标准错误输出(stderr)
当使用这个函数打开一个QFile时,()并不真正关闭这个文件,只是刷新它。
警告:如果f是标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr),你也许不能搜索。更详细的信息请看()。
也可以参考()。
bool QFile::open ( int&m, int&f )
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
使用m模式和一个存在的文件描述符f打开文件。如果成功,返回真,否则返回假。
当使用这个函数打开一个QFile时,()并不真正关闭这个文件。
使用这个函数打开一个QFile时,它被自动设置为直接模式,这就意味着文件输入/输出函数是慢的。如果你需要更好的执行效率,请你试着使用其它打开函数。
警告:如果f是0(stdin)、1(stdout)或2(stderr)其中之一时,你也许不能搜索。()被设置为INT_MAX(在limits.h文件中)。
也可以参考()。
int QFile::putch ( int&ch ) [虚]
写字符ch到文件。
返回ch,或者如果发生错误,返回-1。
也可以参考()和()。
从中重新实现的。
QIODevice::readAll () [虚]
这个方便的函数返回这个设备中的所有剩余数据。
Q_LONG QFile::readBlock ( char&*&p, Q_ULONG&len ) [虚]
从这个文件中读取最多maxlen字节到p并且返回实际读取的字节数量。
如果发生严重错误,返回-1。
警告:当一个缓存文件为了读写而打开时,我们已经在使用一些C库时遇到了问题。如果在一个写操作后立即执行一个读操作,读缓存中就会包含无用信息。更可怕的是,一些无用信息被写到文件中。在()之前调用()就可以解决这个问题。
也可以参考()。
从中重新实现的。
Q_LONG QFile::readLine ( char&*&p, Q_ULONG&maxlen ) [虚]
读一行文本。
从这个文本中读取最多maxlen字节或者行结束符到p,哪个先发生以哪个为准。返回实际读取的字节数量,或者如果发生错误,返回-1。换行将不会被省略。
这个函数只对缓存文件有效。避免在以标记方式打开的文件中使用()。
也可以参考()和()。
从中重新实现的。
Q_LONG QFile::readLine ( &&&s, Q_ULONG&maxlen )
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
读一行文本。
从这个文本中读取最多maxlen字节或者行结束符到字符串s,哪个先发生以哪个为准。返回实际读取的字节数量,或者如果发生错误,返回-1。换行将不会被省略。
这个函数只对缓存文件有效。避免在以标记方式打开的文件中使用()。
注意这个字符串只能作为无格式的Latin1字节来读,不是Unicode。
也可以参考()和()。
bool QFile::remove ()
移去当前指定文件名的文件。如果成功,返回真,否则返回假。
在文件被移去之前,它被关闭。
bool QFile::remove ( const&&&&fileName ) [静态]
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
移去文件fileName。如果成功,返回真,否则返回假。
void QFile::setDecodingFunction ( &f ) [静态]
设置8位文件名的译码函数位f。默认使用本地指定的8位编码。
也可以参考()和()。
void QFile::setEncodingFunction ( &f ) [静态]
设置Unicode文件名的编码函数为f。默认使用本地指定的8位编码。
也可以参考()。
void QFile::setName ( const&&&&name )
设置文件的名称为name。这个名称可以不包含路径,也可以包含相对路径或者绝对路径。
如果文件已经被打开,不要调用这个函数。
如果文件名没有路径或者使用相对路径,这是使用的路径就是应用程序在调用()的时候的当前路径。
QDir::( "/tmp" );
f.( "readme.txt" );
QDir::( "/home" );
// 在Unix下打开“/home/readme.txt”
注意Qt支持在所有的操作系统中使用目录分隔符“/”。
也可以参卡()、和。
QFile::size () const [虚]
返回文件大小。
也可以参考()。
从中重新实现的。
int QFile::ungetch ( int&ch ) [虚]
把字符ch放回到这个文件中并且如果索引位置不是零的话,减一。
这个函数正常地被调用就是“撤销”()操作。
返回ch,否则,如果发生错误,返回-1。
也可以参考()和()。
从中重新实现的。
这个文件是一部分。
版权所有 &
。保留所有权利。
Copyright & 2002
Qt 3.0.5版没有更多推荐了,
不良信息举报
举报内容:
io学习之read(char[])方法的使用
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!博客分类:
说明:该问题出自thinking in java
参考网上的一些回答:
判断纯对象的时候,首先排除数组, 标记 再排除一些枚举, 原始类型。 排除数组:1.obj.getClass().isArray判断
排除基本类型:2.obj.getClass().isPrimitive();
排除枚举:isEnum(),
排除注释:isAnnotation()。
经过尝试发现:
1.调用isPrimitive()的时候返回值为false(不是基本数据类型);
2.调用isArray()的时候返回值是true。(不是一个真正的对象)
结论:Char数组不属于基本数据类型,也不是一个真正的对象类型。
至于为什么要排除数组,标记,枚举,原始类型,有待考察
浏览: 117049 次
来自: 北京
可以看看java编程思想第二十章了解下注解的基本原理,然后再去 ...
注解的方式不好理解啊
调用isArray()的时候返回值是true,则说明是数组。上 ...
2.调用isArray()的时候返回值是true。( 不是一 ...
谢谢分享,感谢。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'java怎么用read()每次读文件中的四个字节保存在数组中_百度知道
java怎么用read()每次读文件中的四个字节保存在数组中
我有更好的答案
java使用read()方法进行读文件中的四个字节保存在数组总的示例如下: public&static&void&main(String[]&arg)&throws&Exception&{
BufferedReader&reader&=&new&BufferedReader(new&FileReader(&E:/test.txt&));
int[]&list&=&new&int[20];
int&i&=&0;
String&line&=&
while&((line&=&reader.readLine())&!=&null)&{
String[]&vStrs&=&line.split(&&&);
for&(String&str&:&vStrs)&{
list[i++]&=&Integer.parseInt(str);
System.out.println(Arrays.toString(list)); }
软件工程师
//创建文件流对象
File f = new File(&E:\\a.txt&);
//创建读取流对象
FileReader fr = new FileReader(f);
//创建加速器
BufferedReader bfr = new BufferedReader(fr);
String str=&&;
//循环读取
while(str !=null){
str = bfr.readLine();
System.out.println(str);
}//字节流取文件
File f = new File(&E:\\a.txt&);
//创建读取流对象
FileInputStream fin = new FileInputStream(f);
byte b[] = new byte[1024];
int count =0;
while((count = fin.read(b))&0){
System.out.println(count);
//字符转换 string 和 byte
String s = new String(b,0,count);
System.out.println(s);
fin.close();
package com.lilina.
public class Eg1 {
public static void main(String[] args) throws Exception {
//创建对象
FileInputStream fl = new FileInputStream(&e:\\Hydrangeas.jpg&);
FileOutputStream fo = new FileOutputStream(&c:\\Hydrangeas.jpg&);
int count=0;
byte b[]=new byte[1024];
//循环读取
while((count=fl.read(b))&0){
fo.write(b, 0, count);
fl.close();
fo.close(); }}
我现在要新建一个自己的数组来保存读取的数据,这些数据是每四个字节一个数据的,请问我该怎么读取和保存在我自己的数组中,。。。。。。。急人啊。。。。谢谢。
边读边写进文件 再循环的时候
本回答被提问者采纳
File file = new File(fileName);
BufferedInputStream bufferInput = new BufferedInputStream(new FileInputStream(file));
int temp = 0;
while ((temp=bufferInput.read())!=-1) {
System.out.print(temp);
bufferInput.close();
} catch (Exception e) {
e.printStackTrace();
//缓冲byte[] data = new byte[4];//读取int len = read(data);while(len==4){len = read(data);//其他处理 }
File file = new File(fileName);
BufferedInputStream bufferInput = new BufferedInputStream(new FileInputStream(file));
ch = new char[4];
int i = 0;
while ((ch[i] = bufferInput.read())!=-1) {
if(i == 4){
//当有四个字节保存在数组中则输出
System.out.println(ch);//你也可以把 ch 转成String 再赋给你创建的数组。
bufferInput.close();
} catch (Exception e) {
e.printStackTrace();
回去看看,API吧
jjyjftyjty
其他4条回答
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 filereader的read方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信