C++,java读写二进制文件方法介绍

C++,java读写二进制文件方法介绍
C++,java读写二进制文件方法介绍

今天终于弄明白怎样使用C++读写二进制文件了。

要读取文件必须包含头文件,这里包含了C++读写文件的方法。可以使用fstream类,这个类可以对文件进行读写操作。

1、打开文件。

打开文件可以有两种方式,第一种可以使用fstream类的构造函数。fstream file("test.dat",ios_base::in|ios_base::out|ios_base::app); 另外一种方法就是使用open函数。

fstream file;

file.open("test.dat",ios_base::in|ios_base::out|ios_base::app);

这样就可以打开一个可读写的文件了。如果文件不存在的话,就会创建一个新文件并且以读写方式打开。

这里需要说明一点,如果文件不存在的话,open函数中第二个参数必须包含

ios_base::out|ios_base::app,

否则就不能正确创建文件。

2、写文件。

先进性写文件的操作否则读一个空文件是没有意义的。

既然是写二进制文件可以向文件中写入一个整形值。写二进制字符只能使用write函数。但是write函数的原形是write(const char * ch, int size)。第一个参数是char *类型,所以需要把将要写入

文件的int类型转换成char *类型。这里的转换困扰了我好几天,不过终于弄明白了。代码如下。

int temp;

file.write((char *)(&temp),sizeof(temp));

3、读文件。

可以写文件了,读文件就好办多了。读文件需要用到read函数。其参数和write大致相同,read(const char * ch, int size)。

要把内容读到int类型变量中同样涉及到一个类型转换的问题。和写文件一样。

int readInt;

file.read((char *)(&readInt),sizeof(readInt));

这样文件中的int值就读入到int型变量readInt中了。

4、文件指针。

在文件的读写过程中往往需要对文件进行选择性读取。所以需要进行文件指针的移动。这是需要用到seekg和seekp函数。

在fstream类中有两个文件指针,一个是读取文件的指针,一个是写文件的指针分别用tellg 和tellp文件来取得指针的位置。

同样seekg和seekp两个函数分别是对这两个指针进行移动的函数。这两个函数的参数都是一样的。

先对几个枚举类型进行一下说明:

ios_base::beg ——文件开始位置

ios_base::cur ——文件当前位置

ios_base::end ——文件末尾位置

下面以seekg为例说明一下指针移动的方法:

file.seekg(3) ——指针移动到第三个字符的位置

file.seekg(ios_base::beg) ——指针移动到文件开头

file.seekg(ios_base::end) ——指针移动到文件末尾

file.seekg(-3,ios_base::cur) ——指针当前位置向前移动三个字符

file.seekg(3,ios_base::cur) ——指针当前位置向后移动三个字符

file.seekg(3,file.tellg()) ——指针当前位置向后移动三个字符

file.seekg(file.tellg()+3) ——指针当前位置向后移动三个字符

5、对文件操作完毕后别忘了关闭文件。

file.close();

C++文件流:

fstream// 文件流

ifstream// 输入文件流

ofstream// 输出文件流

//创建一个文本文件并写入信息

//同向屏幕上输出信息一样将信息输出至文件

#include

#include

void main()

{

ofstream f1("d:\\me.txt");//打开文件用于写,若文件不存在就创建它

if(!f1)return;//打开文件失败则结束运行

f1<

f1<

f1.close();//关闭文件

}

运行后打开文件d:\me.txt,其内容如下:

姓名:廉东方

家庭地址:河南郑州

文件操作:

打开文件

文件名

注意路径名中的斜杠要双写,如:

"D:\\MyFiles\\ReadMe.txt"

文件打开方式选项:

ios::in= 0x01,//供读,文件不存在则创建(ifstream默认的打开方式)

ios::out= 0x02,//供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)

ios::ate= 0x04,//文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用

ios::app= 0x08,//供写,文件不存在则创建,若文件已存在则在原文件内容后写入新的内容,指针位置总在最后

ios::trunc= 0x10,//在读写前先将文件长度截断为0(默认)

ios::nocreate= 0x20,//文件不存在时产生错误,常和in或app联合使用

ios::noreplace = 0x40,//文件存在时产生错误,常和out联合使用

ios::binary= 0x80//二进制格式文件

文件保护方式选择项:

filebuf::openprot;//默认的兼容共享方式

filebuf::sh_none;//独占,不共享

filebuf::sh_read;//读共享

filebuf::sh_write;//写共享

打开文件的方法

调用构造函数时指定文件名和打开模式

ifstream f("d:\\12.txt",ios::nocreate);//默认以ios::in 的方式打开文件,文件不存在时操作失败

ofstream f("d:\\12.txt");//默认以ios::out的方式打开文件

fstream f("d:\\12.dat",ios::in|ios::out|ios::binary);//以读写方式打开二进制文件

使用Open成员函数

fstream f;

f.open("d:\\12.txt",ios::out);//利用同一对象对多个文件进行操作时要用到open函数

检查是否成功打开

成功:

if(f){...}//对ifstream、ofstream对象可用,fstream对象不可用。

if(f.good()){...}

失败:

if(!f){...}// !运算符已经重载

if(f.fail()){...}

读写操作

使用<<,>>运算符

只能进行文本文件的读写操作,用于二进制文件可能会产生错误。

使用函数成员get、put、read、write等

经常和read配合使用的函数是gcount(),用来获得实际读取的字节数。

读写二进制文件注意事项

打开方式中必须指定ios::binary,否则读写会出错

用read\write进行读写操作,而不能使用插入、提取运算符进行操作,否则会出错。

使用eof()函数检测文件是否读结束,使用gcount()获得实际读取的字节数

关闭文件

使用成员函数close,如:

f.close();

利用析构函数

对象生命期结束时会检查文件是否关闭,对没有关闭的文件进行关闭操作。

随机读写文件

通过移动文件读写指针,可在文件指定位置进行读写。

seekg(绝对位置);//绝对移动,//输入流操作

seekg(相对位置,参照位置);//相对操作

tellg();//返回当前指针位置

seekp(绝对位置);//绝对移动,//输出流操作

seekp(相对位置,参照位置);//相对操作

tellp();//返回当前指针位置

参照位置:

ios::beg= 0//相对于文件头

ios::cur= 1//相对于当前位置

ios::end= 2//相对于文件尾

读写文本文件的示例

//为能够正确读出写入文件的各数据,各数据间最好要有分隔

#include

void main()

{

fstream f("d:\\try.txt",ios::out);

f<<1234<<' '<<3.14<<'A'<<"How are you"; //写入数据

f.close();

f.open("d:\\try.txt",ios::in);

int i;

double d;

char c;

char s[20];

f>>i>>d>>c;//读取数据

f.getline(s,20);

cout<

cout<

cout<

cout<

f.close();

}

运行结果:

1234

3.14

A

How are you

Press any key to continue

显示文本文件的内容

//使用get()一次读一个字符--------------------------------方案一

#include

void main()

{

ifstream fin("d:\\简介.txt",ios::nocreate);

if(!fin){

cout<<"File open error!\n";

return;

}

char c;

while((c=fin.get())!=EOF)cout<

}

//使用get(char *,int n,char delim='\n')一次读多个字符----方案二

//巧妙利用文本文件中不会有字符'\0'的特点进行读取

#include

void main()

{

ifstream fin("d:\\简介.txt",ios::nocreate);

if(!fin){

cout<<"File open error!\n";

return;

}

char c[80];

while(fin.get(c,80,'\0')!=NULL)cout<

fin.close();

}

//使用read(char *,int n)读文件---------------------------方案三

#include

void main()

{

ifstream fin("d:\\简介.txt",ios::nocreate);

if(!fin){

cout<<"File open error!\n";

return;

}

char c[80];

while(!fin.eof())//判断文件是否读结束{

fin.read(c,80);

cout.write(c,fin.gcount());

}

fin.close();

}

拷贝文件

//二进制文件操作示例

#include

void main()

{

ifstream fin("C:\\1.exe",ios::nocreate|ios::binary);

if(!fin){

cout<<"File open error!\n";

return;

}

ofstream fout("C:\\2.exe",ios::binary);

char c[1024];

while(!fin.eof())

{

fin.read(c,1024);

fout.write(c,fin.gcount());

}

fin.close();

fout.close();

cout<<"Copy over!\n";

}

Java

一、写二进制数据到文件

1、java.io包中读写二进制数据的类是:OutputStream及其子类

2、其中FileOutputStream用于将二进制书写入文件中

3、DataOutputStream,常用于连接到FileOutputStream上,便于写各种java基本类型的数据,

4、简单的写二进制数据到文件的例子

将三个int型数字255,0,-1,写入数据文件data1.dat

/*

* 演示了写入二进制数据到一个文件中

* */

import java.io.*;

public class Ex6_7 {

public static void main(String[] args){

String fileName="c:/data1.dat";

int intV1=255,intV2=0,intV3 = -1;

//将这三个数写到文件中

try{

//看DataOutputStream怎么连接到一个FileOutputStream

DataOutputStream out = new DataOutputStream(new FileOutputStream(fileName));

out.writeInt(intV1); //写基本类型数据

out.writeInt(intV2);

out.writeInt(intV3);

out.close();

}

catch(IOException e){}

}

}

------用ultraEdit打开看data1.dat二进制内容为:00 00 00 FF 00 00 00 00 FF FF FF FF

可以看出每个整型数字都是4个字节,32个bit.

5、DataOutputStream的常用方法:

+DataOutputStream(outputstream)----- 构造方法,参数为一个outputstream对象,作为其底层的输出对象---上例的FileOutputStream就是一个底层的输出对象

+protected int written:--------------------- 私有属性,代表当前已经写出(?)的字节数

+public void flush():------------------------冲刷次数据流,使流内的数据都被写出

+public final int size() :--------------------返回written变量的值,即已经写出的字节数

+write(int b) :--------------------------------向底层输出流输出int变量的低8位。且written+1;---低8位?

+writeBoolean(boolean b) :--------------true:1,False 0, +1

+writeByte(int b):---------------------------将int参数的低8位写入,舍弃高24位,计数器+1-----有点类似write(int b)方法?

+writeBytes(String s):---------------------字符串中每个字符被丢掉高8位写入流中,计数器增加写入的字节数,即:字符个数。

+writeChar(int c) :--------------------------将16为字符写入流中,高位在前,+2

+writeDouble(double v):------------------双精度数据写入流中,+8

+writeFloat(float f):------------------------单精度数据写入流中,+4

+writeInt(int i):------------------------------整型数据写入,+4

+writeLong(long l):------------------------写长整型,+8

+writeShort(int s):-----------------------短整型,+2

DataOutputStream.size()方法,可以作为计数器统计写入的字节数(每写数据到流中的时候时候,自动对written做加计算,注意上面的+8,+4等)

6、二进制文件也有缓冲流泪BufferedOutputStream,方便大量数据的写入

二、读出二进制数据文件

关于二进制文件读写的详细解说

先介绍函数,我们一共要用到三个函数,fopen,fread,fwrite。二进制读写的顺序是用fopen以二进制方式打开读写文件,然后使用fread和fwrite两个函数将数据写入二进制文件中。下面我们看看一个拷贝程序的源码:

2中,注意fread的返回值,这个值需要在fwrite的时候将会用到。 后面是关于fopen,fread,fwrite三个函数的详细说明。 fopen(打开文件) 相关函数open,fclose 表头文件#include 定义函数FILE * fopen(const char * path,const char * mode); 函数说明参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。 mode有下列几种形态字符串: r 打开只读文件,该文件必须存在。 r+ 打开可读写的文件,该文件必须存在。 w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会 消失。若文件不存在则建立该文件。 w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内 容会消失。若文件不存在则建立该文件。 a 以附加的方式打开只写文件。若文件不存在,则会建立该文件, 如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会 被保留。 a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文 件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的 内容会被保留。

上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等 组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非 纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由 fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_I WGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考um ask值。 返回值文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。 附加说明一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误 判断及处理。 范例#include main() { FILE * fp; fp=fopen("noexist","a+"); if(fp= =NULL) return; fclose(fp); } fread(从文件流读取数据) 相关函数fopen,fwrite,fseek,fscanf 表头文件#include 定义函数size_t fread(void * ptr,size_t size,size_t nmemb,FILE * strea m); 函数说明fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参 数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目, 如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错 误发生,这时必须用feof()或ferror()来决定发生什么情况。 返回值返回实际读取到的nmemb数目。 附加说明 范例#include #define nmemb 3 struct test { char name[20]; int size; }s[nmemb]; main() { FILE * stream; int i;

java文件流操作

java 文件流操作 2010-05-08 20:17:23| 分类:java SE | 标签:|字号大中小订阅 java中多种方式读文件 一、多种方式读文件内容。 1、按字节读取文件内容InputStream 读取的是字节 2、按字符读取文件内容InputStreamReader 读取的是字符 3、按行读取文件内容BufferredReader 可以读取行 4、随机读取文件内容 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.io.Reader; public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。* @param fileName 文件的名 */ public static void readFileByBytes(String fileName){ File file = new File(fileName); InputStream in = null; try { System.out.println("以字节为单位读取文件内容,一次读一个字节:"); // 一次读一个字节 in = new FileInputStream(file); int tempbyte; while((tempbyte=in.read()) != -1){ System.out.write(tempbyte); } in.close(); } catch (IOException e) { e.printStackTrace(); return; } try { System.out.println("以字节为单位读取文件内容,一次读多个字节:"); //一次读多个字节

使用文本文件 txt 进行数据存取的技巧总结 相当

使用文本文件txt 进行数据存取的技 巧总结相当 使用文本文件(.txt)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用"--转--"标注,原作者略去,在此对所有原作者表示感谢! 特别说明:由于大家在I/O存取上以txt文件为主,且读取比存储更麻烦(存储的话fwrite,fprintf基本够用),因此下面的讨论主要集中在"txt文件 的读取"上。除了标注了"转"之外,其余心得均出于本人经验之结果,欢迎大家指正、补充。 一.基本知识: --转-- 1.二进制文件与文本文件的区别: 将文件看作是由一个一个字节(byte)组成的,那么文本文件中的每个字节 的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是 打开方式不同,对于这些0和1的处理也就不同。如果按照文本方式打开,在 打开的时候会进行translate,将每个字节转换成ASCII码,而以按照二进制 方式打开的话,则不会进行任何的translate;最后就是文本文件和二进制文 件在编辑的时候,使用的方式也是不同的。譬如,你在记事本中进行文本编辑 的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种:

Java读取txt文件中指定行内容

获取文本内容与读取文本指定行数内容浅析(java) 在此项目中直接套用以前工程中获取文本内容的方法发现一直提示“数组下标越界”,通过分析和查找得出以下心得: 获取文本内容: private static final String CHART_PATH ="D://data3"; public static void main(String[] args) throws RowsExceededException,WriteException, BiffException{ try { readFileByLines(CHART_PATH+".txt"); } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } public static void readFileByLines(String fileName) throws IOException,RowsExceededException,WriteException{ //打开文件 WritableWorkbook book = Workbook.createWorkbook( new File(CHART_PATH+".xls")); WritableSheet sheet = book.createSheet("看我", 0); //读取txt文件内容 File file = new File(fileName); FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis,"GBK"); BufferedReader reader = null; try { reader = new BufferedReader(isr); String temString = null; //一次读入一行,以null结束 int i = 0; while((temString = reader.readLine())!= null){ System.out.println("+++++++"+temString); String[] str = temString.split(","); for(int j= 0;j

java对文件名的几个操作,获取文件扩展名,去掉扩展名

java对文件名的几个操作,获取文件扩展名,去掉扩展名 /** * Return the extension portion of the file's name . * * @see #getExtension */ public static String getExtension(File f) { return (f != null) ? getExtension(f.getName()) : ""; } public static String getExtension(String filename) { return getExtension(filename, ""); } public static String getExtension(String filename) { return getExtension(filename, ""); } public static String getExtension(String filename, String defExt) { if ((filename != null) && (filename.length() > 0)) { int i = https://www.360docs.net/doc/d013969560.html,stIndexOf('.'); if ((i >-1) && (i < (filename.length() - 1))) { return filename.substring(i + 1); } } return defExt; } public static String trimExtension(String filename) { if ((filename != null) && (filename.length() > 0)) { int i = https://www.360docs.net/doc/d013969560.html,stIndexOf('.'); if ((i >-1) && (i < (filename.length()))) { return filename.substring(0, i); } } return filename; } substring(参数)是java中截取字符串的一个方法 有两种传参方式

java读取上传excel文件和txt文件中的数据

Java 读取上传文件里的数据,记事本文件和excel文件 本文,文本文件里的数据,每列以 Tab 分隔。 其它分隔符情况下,只需修改对分隔符的判断即可 本文是将文本文件或excel文件里的数据读到List 里。 List , List, ........可以改为返回其它类型的数据集 UpLoadExcel 类里需要操作excel的 jar包 import org.apache.poi.* ; 网上可以搜索下载,简单快捷 ---------------------------------------------------------------------------- - - - public class upLoadAction extends DispatchAction { public ActionForward doAdd(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { TestForm myForm = (TestForm) form; FormFile f = myForm.getUpfisle(); //get上传文件 String fileName = f.getFileName(); // 截取文件名的后三位字符 String fileType = fileName.substring(fileName.length()-3,fileName.length()); System.out.println("导入的文件名:"+fileName+"\t 文件后缀名:"+fileType); List list = new ArrayList(); if("xls".equals(fileType)){ // 上传文件是excel时文件文件后缀名为xls list = new UpLoadExcel().getExcelData(f.getInputStream()); }else if("txt".equals(fileType)){ list = new UploadText().UploadText(f.getInputStream()); } // 操作读取出来的数据,例如: if (list.size() > 0) { String[] str = null; for(int i = 0; i < list.size(); i++) { str = list.get(i); st = "insert into student (sName,sAge,sAddress,sTelephone) values(" ; st = "'" + st + str[0] + "'"; st = ",'" + st + str[1] + "'"; st = ",'" + st + str[4] + "'"; st = ",'" + st + str[6] + "'"; st = st + ")"; ...... System.out.println(st);

二进制文件的读写以及相关心得

二进制文件读写分析 有关TXT文件以及bin文件处理的测试代码 int main() { //fstream file("D:\\test.dat",ios_base::in|ios_base::out|ios_base::app); fstream file; file.open("D:\\test1.dat",ios_base::out); { int temp[10] = {0x11,0x13,0x14,0x1F,0x1D,0x11,0x11,0x12,0x11,0x11}; int temp1[10]; file.write((char *)temp,sizeof(temp)); file.close(); file.open("D:\\test1.dat",ios_base::in); file.read((char *)temp,sizeof(temp)); unsigned int i; cout<

java文件读写代码

1、按字节读取文件内容 2、按字符读取文件内容 3、按行读取文件内容 4、随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。 */ public static void readFileByBytes(String fileName) { File file = new File(fileName); InputStream in = null; try { System.out.println("以字节为单位读取文件内容,一次读一个字节:"); // 一次读一个字节 in = new FileInputStream(file); int tempbyte; while ((tempbyte = in.read()) != -1) { System.out.write(tempbyte); } in.close(); } catch (IOException e) { e.printStackTrace(); return; } try { System.out.println("以字节为单位读取文件内容,一次读多个字节:"); // 一次读多个字节 byte[] tempbytes = new byte[100]; int byteread = 0; in = new FileInputStream(fileName); ReadFromFile.showAvailableBytes(in); // 读入多个字节到字节数组中,byteread为一次读入的字节数 while ((byteread = in.read(tempbytes)) != -1) { System.out.write(tempbytes, 0, byteread); }

C++中Txt文件读取和写入

C++中Txt文件读取和写入 标签:c++nullstringios文本编辑file 2012-10-07 16:58 45182人阅读评论(3) 收藏举报 分类: C/C++基础(75) C++中Txt文件读取和写入 一、ASCII 输出 为了使用下面的方法, 你必须包含头文件(译者注:在标准C++中,已经使用 取代< fstream.h>,所有的C++标准头文件都是无后缀的。)。这是的一个扩展集, 提供有缓冲的文件输入输出操作. 事实上, 已经被包含了, 所以你不必包含所有这两个文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O操作。如果你猜是"fstream," 恭喜你答对了!但这篇文章介绍的方法,我们分别使用"ifstream"?和"ofstream" 来作输入输出。 如果你用过标准控制台流"cin"?和"cout," 那现在的事情对你来说很简单。我们现在开始讲输出部分,首先声明一个类对象。 ofstream fout; 这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream::open()。 fout.open("output.txt"); 你也可以把文件名作为构造参数来打开一个文件. ofstream fout("output.txt"); 这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和"cout"的操作很像。对不了解控制台输出"cout"的人, 这里有个例子。 int num = 150; char name[] = "John Doe"; fout << "Here is a number: " << num << "/n"; fout << "Now here is a string: " << name << "/n"; 现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你不再操作这个文件的时候才调用它,它会自动保存文件。回写缓冲区会在保持文件打开的情况下保存文件, 所以只要有必要就使用它。 回写看起来像另一次输出, 然后调用方法关闭。像这样:

Java流(文件读写操作)

Java流 一、流的分类 ?按数据流动方向 –输入流:只能从中读取字节数据,而不能向其写出数据 –输出流:只能向其写入字节数据,而不能从中读取数据?按照流所处理的数据类型 –字节流:用于处理字节数据。 –字符流:用于处理Unicode字符数据。 ?按照流所处理的源 –节点流:从/向一个特定的IO设备读/写数据的流。(低级流)–处理流:对已存在的流进行连接和封装的流。(高级流)二、缓冲流 ?缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。 ?J2SDK提供了四种缓存流: –BufferedReader –BufferedWriter –BufferedInputStream s –BufferedOutputStream

?缓冲输入流支持其父类的mark()和reset()方法: –mark()用于“标记”当前位置,就像加入了一个书签,可以使用reset()方法返回这个标记重新读取数据。?BufferedReader提供了readLine()方法用于读取一行字符串(以\r 或\n分隔)。 ?BufferedWriter提供了newLine()用于写入一个行分隔符。 ?对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()方法将会使内存中的数据立刻写出。 三、类层次 3.1、InputStream类层次

3.2、OutputStream类层次 3.3、Reader类层次

3.4、Writer类层次 四、常用的字符流与字节流的转化 说明: 1.字节流用于读写诸如图像数据之类的原始字节流。 2.字符流用于读写诸如文件数据之类的字符流。 3.低级流能和外设交流。 4.高级流能提高效率。 5.InputStreamReader 是字节流通向字符流的桥梁。 6.OutputStreamWriter 是字符流通向字节流的桥梁。

解码labview读写二进制文件格式

解码labview读写二进制文件格式 一直觉得NI 很恶心,最近越发觉得恶心,竟知道骗钱,我花了2 周去探它该死的数据格式,问他们售后居然说不知道...还得我亲自动手...现在把数据格式写下来,为大家做点贡献吧...关于用matlab/vc 读二进制文件write to binary file 的数据NI 可以直接用这个函数把数据写下来,但是读取格式不告诉你,要你用它的软 件去读...读的方法:1) 用uchar 去读,将数据转置存储;2)用浮点去读,倒序;-------- 这些在网上可以查到,下面才是关键.... 对64 位数据:3)每个通道有21 个数据是头文件,即21*64bit 的头信息,可以不去管它,跳过; 4)除了头文件外,每个通道还有1-3 个字节的信息(不知道什么玩意儿),要跳过;具体来讲是这样,如果有6 个通道, 第一个通道存储了1 个字节,要扣除;第2,4,5 个通道多了2 个字节,要扣除;第3,6 通道多了3 个字节要扣除.但是必须从3 开始扣.即假如总共N 字节数据,则第一个通道读N-3 个,接下来2,4,5 要读N-4 个,剩下的3,6 要读N-5 个.只有这样才能正确的读取.不过要注意数据倒序的问题,实际的数据可能正好通道顺序相反.5) 剩下的就是编程的问题了,还有很多细节大家可以自己解决,再看怎么要内存最小,耗时最短...我是没有在NI 的说明文档里面找对相关的数据存储格式,这里是 6 个通道的举例,要是5 个通道又得慢慢试了...再来一句,NI 真恶心,其实没必要 保留数据格式...搞的人家都要用它的软件...tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

java File文件操作和文件流的详解(福哥出品)

一. 创建文件 (1)最常用的(获得一个固定路径下的文件对象) File parentFile = new File(“D:\\My Documents\\.....”);//参数是一个路径的字符串。 (2)在父目录创建一个名为child的文件对象,child 为文件对象的名字 File chileFile= new File(“D:\\My Documents\\.....”,String child); 或File chileFile= new File(parentFile,String child); 二,常见文件夹属性和方法 (1)createNewFile(); 该方法的作用是创建指定的文件。该方法只能用于创建文件,不能用于创建文 件夹,且文件路径中包含的文件夹必须存在 File file=new ("D:\\My Document\\text.txt"); file.createNewFile(); 这样就会在D盘下的My Document 创建text.txt的记事本(注意:首先得保 证D盘下有My Documen这个文件夹) (2)mkdir(); 根据File对象的名字(路径)创建一个目录(文件夹),如果是相对目录,则新建的目

录在当前目录下 (3)mkdirs(); 如果File对象名字有多级目录,则可以调用该方法一次性创建多级目录。 (4)exists(); 判断File对象指向的文件是否存在,返回一个boolean类型(5)isDirectory(); 判断File对象指向的文件是否为目录,返回一个boolean类型的值,true或者false。 (6)getName();获得文件名称(不带路径) (7)length(); 得到File对象指向文件的长度,以字节计算,返回一个长整形的值(long);注意:在 系统中,文件夹(目录)的大小为零,也就是不占用空间,使用length()时返回的是0 (8)delete(); 删除File对象所指定的文件 (9)isFile(); 判断File对象指向的文件是不是标准文件(就像图片,音乐文件等) 三,文件的属性和方法 1.File.separator 当前操作系统的名称分隔符,等于字符串“\”.

二进制文件和文本文件的详细以及如何生成二进制文件-推荐下载

二进制文件和文本文件的详细以及如何生成二进制文件? 技术随笔 2010-05-01 19:13:56 阅读226 评论0 字号:大中小订阅 这个问题一直困扰了很多年,可能是我没有认真的去思考。我相信很多人可能和我一样很纠葛,到底编译器也好,汇编器也好是如何工作的呢?到底怎么回事?为什么会运行呢?这是让我们这些看着windows 学习电脑的人真的很难去理解计算机的内部结构。其实,这一切都只是障眼法,下面我就来给大家细细说说我对计算机的理解。 解答1:编译器是怎么回事? 所谓编译器,顾名思义就是将一种文本格式转换成另一种文本格式。比如将字符串echo "hello"; 转换成printf("hello"); 这其实是php语言转成c语言的一种表示。这只是一种简单的描述,其实很大一部分的编译器是将源语言转换成了汇编语言。下面我们来看看 C 语言中的经典hello word,通过gcc编译后生成的汇编是怎么回事。 c语言源码: #include int main() { printf("hello world\n"); } 通过编译器后,编译器把这个翻译成了另一套字符串,其实就是汇编语言: .file "hello.c" .section .rodata .LC0: .string "hello world" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16,%esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $4, %esp movl $.LC0, (%esp) call puts addl $4, %esp popl %ecx popl %ebp leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.1.2"

java将对象保存到文件中从文件中读取对象

1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Object obj) { File file =new File("test.dat"); FileOutputStream out; try { out = new FileOutputStream(file); ObjectOutputStream objOut=new ObjectOutputStream(out); objOut.writeObject(obj); objOut.flush(); objOut.close(); System.out.println("write object success!"); } catch (IOException e) { System.out.println("write object failed"); e.printStackTrace(); } } 参数obj一定要实现Serializable接口,否则会抛出 java.io.NotSerializableException异常。另外,如果写入的对象是一个容器,例如List、Map,也要保证容器中的每个元素也都是实现了Serializable 接口。例如,如果按照如下方法声明一个Hashmap,并调用writeObjectToFile方法就会抛出异常。但是如果是 Hashmap就不会出问题,因为String类已经实现了Serializable接口。另外如果是自己创建的类,如果继承的基类没有实现Serializable,那么该类需要实现Serializable,否则也无法通过这种方法写入到文件中。 Object obj=new Object(); //failed,the object in map does not implement Serializable interface HashMap objMap=new HashMap(); objMap.put("test", obj); writeObjectToFile(objMap);

java输入输出流和文件操作

Java IO流和文件操作Java流操作有关的类或接口: Java流类图结构:

1、File类 File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。 构造方法摘要 File(File parent, String child) File(String pathname) File(String parent, String child) 构造函数 创建方法 1.boolean createNewFile() 不存在返回true 存在返回false 2.boolean mkdir() 创建目录 3.boolean mkdirs() 创建多级目录 删除方法 1.boolean delete() 2.boolean deleteOnExit() 文件使用完成后删除 例子1:列出指定文件夹的文件或文件夹 public class FileDemo1 { public static void main(String[] args){ File[] files =File.listRoots(); for(File file:files){

System.out.println(file); if(file.length()>0){ String[] filenames =file.list(); for(String filename:filenames){ System.out.println(filename); } } } } } 例子2:文件过滤 import java.io.File; public class FileTest2 { public static void main(String[] args) { File file = new File("file"); String[] names = file.list(); for(String name : names) { if(name.endsWith(".java")) { System.out.println(name); }

C打开文件 文本方式 二进制方式

C打开文件文本方式二进制方式 2009年11月01日星期日 22:53 Windows平台下 如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"\r\n"转换成"\n";当写入文件的时候,系统会将"\n"转换成"\r\n"写入。 如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。 在Unix/Linux平台下,“文本”与“二进制”模式没有区别。 数据有字符型和非字符型(数)两种。按文本方式写文件指的是将数据转换为对应的字符型数据之后再写入文件。对于字符型数据,由于其本身就是ASCII码字符,一般不必转换,直接写入文件。但是,由于不同的系统对于换行符('\n')有不同的处理(转换)方式,在有的系统(如Windows)下也会对 '\n' 作适当的转换。 对于非字符型数据,都要进行转换处理。例如:int m = 12; 以及 double f = 2.3;,分别按照 "%d"、"%lf" 方式将 m 和 f 写入文件的时候,写入的分别是 '1'、'2' 两个字符以及 '2'、'.'、'3' 等三个字符的ASCII码值。显然,如果按照二进制方式写的话,在文件中一般 m 要占 4 个字节、f 要占 8 个字节。 一、文本文件与二进制文件的定义 大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。 简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。 从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如 UTF-8),基于字符嘛,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。大家可能对BMP文件比较熟悉,就拿它举例子吧,其头部是较为固定长度的文件头信息,前2字节用来记录文件为BMP格式,接下来的8个字节用来记录文件长度,再接下来的4字节用来记录bmp文件头的长度。。。大家可以看出来了吧,其编码是基于值的(不定长的,2、4、8字节长的值都有),所以BMP是二进制文件。 二、文本文件与二进制文件的存取 文本工具打开一个文件的过程是怎样的呢?拿记事本来说,它首先读取文件物理上所对应的二进制比特流(前面已经说了,存储都是二进制的),然后按照你所选择的解码方式来解释这个流,然后将解释结果显示出来。一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。例如对于这么一个文件流"01000000_01000001_01000010_01000011"(下划线''_'',是我为了增强可读性,而手动添加的),第一个8比特''01000000''按ASCII码来解码的

java读入文本文件到TextArea(打开功能实现)

java读入文本文件到TextArea(打开功能实现) Java语言: import java.awt.*; import java.io.*; import java.awt.event.*; public class IOtest extends Frame implements ActionListener{ private Frame f; private TextArea ta; //ta用于显示打开的内容 private Button btn; private FileDialog fd; private File file1 = null; //构造函数开始 public IOtest(){ btn = new Button("打开"); ta = new TextArea(5,50); btn.addActionListener(this);//给按钮添加事件监听器 } //给按钮添加行为 public void actionPerformed(ActionEvent e){ if (e.getSource()==btn) { //单击打开按钮时 fd = new FileDialog(f,"Open",FileDialog.LOAD); fd.setVisible(true); //创建并显示打开文件对话框 //if ((fd.getDirectory()!=null) && (fd.getFile()!=null)) { try { //以缓冲区方式读取文件内容 file1 = new File(fd.getDirectory(),fd.getFile()); FileReader fr = new FileReader(file1); BufferedReader br = new BufferedReader(fr); String aline; while ((aline=br.readLine()) != null)//按行读取文本 ta.append(aline+"\r\n"); fr.close(); br.close(); } catch (IOException ioe){ System.out.println(ioe); } }

【IT专家】Linux下二进制方式读写文件

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 Linux下二进制方式读写文件 2017/03/29 0 最近在做项目需要把内存数据写入到文件中,然后再从文件中以二进制方式读出使用。由于接触Linux开发时间不长,开始询问度娘,度娘的 回答是使用以wb方式打开文件后使用fwrite把数据写入文件,以rb方式打开文件 后使用fread读出数据。下面详细介绍一下相关的函数极其使用说明。需要用的头文件为stdio.h,函数结构为fwrite、fread、fseek、ftell、fstat。1. fwrite size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); 返回:返回实际写入的数据块数目(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;(2)size:要写入内容的单字节数;(3)count: 要进行写入size 字节的数据项的个数;(4)stream: 目标文件指针;(5)返回实际写入的数据项个数count。说明:写入到文件的哪里?这个与文件的打开模式有关,如果是w ,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a ,则从文件的末尾开始添加,文件长度加大。注意:这个函数以二进制形式对文件进行操作,不局限于文本文件2. fread size_t fread(void *buffer, size_t size, size_t count, FILE *stream) ; 返回:返回真实写入的项数,若大于count则意味着产生了错误。另外,产生错误后,文件 位置指示器是无法确定的。若其他stream或buffer为空指针,或在unicode模式中 写入的字节数为奇数,此函数设置errno为EINVAL以及返回0. (1)buffer:用于接收数据的内存地址;(2)size:要读的每个数据项的字节数,单位是字节;(3)count:要读count个数据项,每个数据项size个字节.;(4)stream: 目标文件指针;3. fseek int fseek(FILE * stream,long offset,int whence); 返回:成功返回0,失败返回-1,errno会存放错误代码。(1)stream: 目标文件指针;(2)offset: 相对于whence的偏移量;(3)whence:绝对位置。说明:fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。注意1:参数whence为下列其中一种::

相关文档
最新文档