⑴ C++中用IO流如何读取存放在 txt 文本中的内容
看书书上讲的很清楚,遇到string的时候再看这段代码。#include <iostream> #include <string> #include <fstream> using namespace std; int main() { string str1; string str2; cin >> str1; cin >> str2; ofstream outfile("temp.dat",ios::binary); if(! outfile) { cerr << "Error ! " <<endl; return 0; } outfile.write((char * )&str1,sizeof(string)); outfile.write((char * )&str2,sizeof(string)); outfile.close(); ifstream infile("temp.dat",ios::binary); if (! infile) { cerr << "Error ! " <<endl; return 0; } infile.read((char * )&str1,sizeof(string)); infile.read((char * )&str2,sizeof(string)); cout <<str1 <<endl; cout <<str2 <<endl; return 1; } 如果我就这样执行的话,str1和str2能保存到文件,而且能够成功读取并显示。 但如果我把“保存”的那一段代码删掉,读取就会失败,显示乱码。怎么回事?怎么解决?(不要复制一大堆东西过来,谢谢。)提问者: darksun113 – 试用期 一级 最佳答案你保存的时候应该这样保存: int main() { string str1; string str2; cin >> str1; cin >> str2; ofstream outfile("temp.dat",ios::binary); if(! outfile) { cerr << "Error ! " <<endl; return 0; } outfile.write(str1.c_str(),str1.size()+1); /*你原来写成(char * )&str1,这样往文件里写入的东西其实是str1这个类的数据(包括了指向实际字符串的指针),而不是字符串。因为string类的字符串是用new在堆上分配的,string类本身只包含字符串的指针,用c_str()这个成员函数可以获得这个指针,你可以看一下string类的源码。 改成这样以后,写入文件里的就是实际的字符串了。 写入的长度应该是字符串的长度(包括结束符'\0')*/ outfile.write(str2.c_str(),str2.size()+1); outfile.close(); return 1; } 读取的时候这样读取: int main() { string str1; str1.reserve(100);/*为str1申请100个字符的空间,如果不申请的话c_str()返回的是空指针,也就是没有空间。假设你上次存的两个字符串长度不超过100。*/ ifstream infile("temp.dat",ios::binary); if (! infile) { cerr << "Error ! " <<endl; return 0; } infile.read((char * )str1.c_str(),100);/*这儿由于不知道你上次写入文件的两个字符串的长度,只能把文件里的内容都读出来再根据'\0'来分析出两个字符串。*/ cout <<str1 <<endl; //输出第一个字符串 cout << (char*)(str1.c_str() + strlen(str1.c_str())+1) << endl;//输出第二个字符串 return 1; } 至于原来你写的程序能够正常工作,是因为你往文件里写的是string类,包含了字符串指针,而同一个进程里面指针是不会变的,所以你读出来之后OK。 当你把“保存”的那一段代码删掉后,你再编译运行这个程序,这时str1/str2分配的指针与你上次写在文件里的指针不同了,所以显示出的字符串是乱码
⑵ java用IO流解析TXT文件,并且将数据写入实体类中!
用split方法分割,循环new出对象,保存到数据库
⑶ java的几种IO流读取文件方式
一、超类:
字节流: InputStream(读入流) OutputStream(写出流)
字符流: Reader(字符 读入流) Writer (字符写出流)
二、文件操作流
字节流: FileInputStream ,FileOutputStream
字符流: FileReader, FileWriter(用法与字节流基本相同,不写)
//1.指定要读 的文件目录及名称
File file =new File("文件路径");
//2.创建文件读入流对象
FileInputStream fis =new FileInputStream(file);
//3.定义结束标志,可用字节数组读取
int i =0 ;
while((i = fis.read())!=-1){
//i 就是从文件中读取的字节,读完后返回-1
}
//4.关闭流
fis.close();
//5.处理异常
//1.指定要写到的文件目录及名称
File file =new File("文件路径");
//2.创建文件读入流对象
FileOutputStream fos =new FileOutputStream(file);
//3.定义结束标志
fos.write(要写出的字节或者字节数组);
//4.刷新和关闭流
fos.flush();
fos.close();
//5.处理异常
三、缓冲流:
字节缓冲流: BufferedInputStream,BufferedOutputStream
字符缓冲流:BufferedReader ,BufferedWriter
缓冲流是对流的操作的功能的加强,提高了数据的读写效率。既然缓冲流是对流的功能和读写效率的加强和提高,所以在创建缓冲流的对象时应该要传入要加强的流对象。
//1.指定要读 的文件目录及名称
File file =new File("文件路径");
//2.创建文件读入流对象
FileInputStream fis =new FileInputStream(file);
//3.创建缓冲流对象加强fis功能
BufferedInputStream bis =new BufferedInputStream(fis);
//4.定义结束标志,可用字节数组读取
int i =0 ;
while((i = bis.read())!=-1){
//i 就是从文件中读取的字节,读完后返回-1
}
//5.关闭流
bis.close();
//6.处理异常
//1.指定要写到的文件目录及名称
File file =new File("文件路径");
//2.创建文件读入流对象
FileOutputStream fos =new FileOutputStream(file);
//3.创建缓冲流对象加强fos功能
BufferedOutputStream bos=new BufferedOutputStream(fos);
//4.向流中写入数据
bos.write(要写出的字节或者字节数组);
//5.刷新和关闭流
bos.flush();
bos.close();
//6.处理异常
四、对象流
ObjectInputStream ,ObjectOutputStream
不同于以上两种类型的流这里只能用字节对对象进行操作原因可以看上篇的编码表比照原理
ObjectOutputStream对象的序列化:
将java程序中的对象写到本地磁盘里用ObjectOutputStream
eg:将Person类的对象序列化到磁盘
创建Person类
注1:此类要实现Serializable接口,此接口为标志性接口
注2:此类要有无参的构造函数
注3:一旦序列化此类不能再修改
class Person implements Serializable{
public Person(){}
}
2.创建对象流对象
注:要增强功能可以将传入文件缓冲流
ObjectOutputStream oos =new ObjectOutputStream(
new FileOutputStream(new File("文件路径")));
3.写入对象 ,一般会将对象用集合存储起来然后直接将集合写入文件
List<Person> list =new ArrayList<>();
list.add(new Person());
…(可以添加多个)
oos.writeObject(list);
4.关闭流,处理异常
oos.flush();
oos.close();
五、转换流:
这类流是用于将字符转换为字节输入输出,用于操作字符文件,属于字符流的子类,所以后缀为reader,writer;前缀inputstream,outputstream;
注 :要传入字节流作为参赛
InputStreamReader: 字符转换输出流
OutputStreamWriter:字符转换输入流
//1.获取键盘输入的字节流对象
inInputStream in =Stream.in;
/*2.用转换流将字节流对象转换为字符流对象,方便调用字符缓冲流的readeLine()方法*/
InputStreamReader isr =new InputStreamReader(in);
/*5.创建字符转换输出流对象osw,方便把输入的字符流转换为字节输出到本地文件。*/
OutputStreamWriter osw =new OutputStreamWriter(newFileOutputStream(new File("文件名")));
/*3.现在isr是字符流,可以作为参数传入字符缓冲流中*/
BufferedReader br =new BufferedReader(isr);/*4.可以调用字符缓冲流br的readLine()方法度一行输入文本*/
String line =null;
while((line =br.readLine()){
osw.write(line);//osw是字符流对象,可以直接操作字符串}
注:InputStreamReader isr =new InputStreamReader(new "各种类型的字节输入流都行即是:后缀为InputStream就行");
OutputStreamWriter osw =new OutputStreamWriter(new"后缀为OutputStream就行");
六、区别记忆
1.对象流是可以读写几乎所有类型的只要是对象就行,而字节字符流,只能读写单个字节字符或者字节字符数组,以上没有读写字节字符数组的;注意对象流只有字节流!
2.字符和字节循环读入的结束条件int i=0; (i =fis.read())!=-1用字符数组复制文件(fr 读入流 ,fw写出流),字节流也是相同的用法
int i = 0; char[] c = new char[1024];
while((i = fr.reade()) !=-1)){
fw.write(c,0,i);
}
123456
3.对象流里面套缓冲流的情景:
new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File(“文件路径”))));
4.记忆流及其功能的方法:
前缀表示功能,后缀表示流的类型;
比如说FileInputStream 前缀:File,表示操作的磁盘,后缀:intputstream,表示是字节输入流。
同理 FileReader:表示操作文件的字符流
ObjectInputStream :操作对象的字节输入流
5.拓展:获取键盘输入的字符的缓冲流的写法:
new BufferedReader(new InputStreamReader(System.in)));
将字节以字符形式输出到控制台的字符缓冲流的写法:
new BufferedWriter( new OutputStreamWriter(System.out))
⑷ java 如何用io流 读取list集合里我需要的内容,然后写入到.txt文件里各位大侠请赐教
importorg.junit.Test;importjava.io.*;importjava.util.ArrayList;importjava.util.List;publicclassTestIo{//路径privatestaticfinalStringPATH="D:\demo1.txt";@TestpublicvoidtestIo()throwsIOException{List<String>list=newArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");Filefile=newFile(PATH);//如果没有文件就创建if(!file.isFile()){file.createNewFile();}//BufferedWriterwriter=newBufferedWriter(newFileWriter(PATH));for(Stringl:list){writer.write(l);}writer.close();System.out.println("完成");}}
结果
希望对你有帮助
⑸ io流挑选读取内容
这个感觉比较麻烦吧。。。可以先在内存中定义一个数组,然后将这些存入数组中,循环数组得到你想要的“小红男的叫哥哥”,然后再写入定义的文件中应该就可以了
⑹ java io流如何读取文件效率高
你在类的使用上不太恰当。如果你想读取文本内容,你应该使用InputStreamReader这个类,使用这个类并且指专定文本内容的字属符集,就可以读出正确的内容。InputStream这个类是用来读取二进制字节的,比如做文件复制的时候,应该是用InputStream这个类。不管是InputStreamReader还是InputStream,都可以声明临时缓冲数组,不同的是InputStreamReader声明的数组是:char[] cs = new char[1024]而InputStream声明的数组是:byte[] bs = new byte[1024]
⑺ java中怎么用io流读写文件
可以通过BufferedReader 流的形式进行流读取,之后通过readLine方法获取内到读取的内容。 BufferedReader bre = null;try {String file = "D:/test/test.txt";bre = new BufferedReader(new FileReader(file));//此时获取到的bre就是整个容文件的缓存流while ((str = bre.readLine())!= null) // 判断最后一行不存在,为空结束循环{System.out.println(str);//原样输出读到的内容};备注: 流用完之后必须close掉,如上面的就应该是:bre.close(),否则bre流会一直存在,直到程序运行结束。
⑻ java用IO流一行行的读取文件
import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;class ThreadDemo{public static void main(String[] args) throws IOException{BufferedReader fr=new BufferedReader(new FileReader("a.txt"));//a.txt代表文件String line=null;while((line=fr.readLine())!=null){System.out.println(line);}}}
⑼ java编程中IO流什么方法把整个文本文件的文字读取入系统
字节流一次读取1个字节,只能读字母字符流一次读取2个字节,可以读取汉字和字母
未经允许不得转载:山九号 » io流读取文件内容|java io流如何读取文件效率高