how2j.cn


工具版本兼容问题
DataInputStream 数据输入流
DataOutputStream 数据输出流


本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



5分23秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



步骤 1 : 直接进行字符串的读写   
步骤 2 : 练习-向文件中写入两个数字,然后把这两个数字分别读取出来   
步骤 3 : 答案-向文件中写入两个数字,然后把这两个数字分别读取出来   

步骤 1 :

直接进行字符串的读写

edit
使用数据流的writeUTF()和readUTF() 可以进行数据的格式化顺序读写
如本例,通过DataOutputStream 向文件顺序写出 布尔值,整数和字符串。 然后再通过DataInputStream 顺序读入这些数据。

注: 要用DataInputStream 读取一个文件,这个文件必须是由DataOutputStream 写出的,否则会出现EOFException,因为DataOutputStream 在写出的时候会做一些特殊标记,只有DataInputStream 才能成功的读取。
直接进行字符串的读写
package stream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class TestStream { public static void main(String[] args) { write(); read(); } private static void read() { File f =new File("d:/lol.txt"); try ( FileInputStream fis = new FileInputStream(f); DataInputStream dis =new DataInputStream(fis); ){ boolean b= dis.readBoolean(); int i = dis.readInt(); String str = dis.readUTF(); System.out.println("读取到布尔值:"+b); System.out.println("读取到整数:"+i); System.out.println("读取到字符串:"+str); } catch (IOException e) { e.printStackTrace(); } } private static void write() { File f =new File("d:/lol.txt"); try ( FileOutputStream fos = new FileOutputStream(f); DataOutputStream dos =new DataOutputStream(fos); ){ dos.writeBoolean(true); dos.writeInt(300); dos.writeUTF("123 this is gareen"); } catch (IOException e) { e.printStackTrace(); } } }
步骤 2 :

练习-向文件中写入两个数字,然后把这两个数字分别读取出来

edit Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
要求
第一种方式: 使用缓存流把两个数字以字符串的形式写到文件里,再用缓存流以字符串的形式读取出来,然后转换为两个数字。
注: 两个数字之间要有分隔符用于区分这两个数字。 比如数字是31和15,如果不使用分隔符,那么就是3115,读取出来就无法识别到底是哪两个数字。 使用分隔符31@15能解决这个问题。

第二种方式: 使用数据流DataOutputStream向文件连续写入两个数字,然后用DataInpuStream连续读取两个数字
步骤 3 :

答案-向文件中写入两个数字,然后把这两个数字分别读取出来

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

3分45秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


从答案可以看到,使用非数据流方式就必须用到分隔符,用于区分两个数据。读取出来之后,还要再解析才能识别数据。

但是用数据流就不需要,挨个挨个读就行了。
答案-向文件中写入两个数字,然后把这两个数字分别读取出来
package stream; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class TestStream { static File f =new File("d:/data.txt"); static int x = 31; static int y = 15; public static void main(String[] args) { //缓存流方式 method1(); //数据流方式 method2(); } private static void method2() { try ( FileInputStream fis = new FileInputStream(f); DataInputStream dis =new DataInputStream(fis); FileOutputStream fos = new FileOutputStream(f); DataOutputStream dos =new DataOutputStream(fos); ){ dos.writeInt(x); dos.writeInt(y); int x = dis.readInt(); int y = dis.readInt(); System.out.printf("使用数据流读取出的x是 %d y是 %d%n",x,y); } catch (IOException e) { e.printStackTrace(); } } private static void method1() { try ( FileWriter fw = new FileWriter(f); PrintWriter pw = new PrintWriter(fw); FileReader fr = new FileReader(f); BufferedReader br = new BufferedReader(fr); ) { pw.print(x+"@"+y); pw.flush(); String str = br.readLine(); String[] ss =str.split("@"); int x = Integer.parseInt(ss[0]); int y = Integer.parseInt(ss[1]); System.out.printf("使用缓存流读取出的x是 %d y是 %d%n",x,y); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static void read() { File f =new File("d:/data.txt"); try ( FileInputStream fis = new FileInputStream(f); DataInputStream dis =new DataInputStream(fis); ){ boolean b= dis.readBoolean(); int i = dis.readInt(); String str = dis.readUTF(); System.out.println("读取到布尔值:"+b); System.out.println("读取到整数:"+i); System.out.println("读取到字符串:"+str); } catch (IOException e) { e.printStackTrace(); } } private static void write() { File f =new File("d:/data.txt"); try ( FileOutputStream fos = new FileOutputStream(f); DataOutputStream dos =new DataOutputStream(fos); ){ dos.writeBoolean(true); dos.writeInt(300); dos.writeUTF("123 this is gareen"); } catch (IOException e) { e.printStackTrace(); } } }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2019-05-11 每次新位置的坐标信息保存到txt中都会把上一次的坐标信息给覆盖掉,这是为什么呀?
卷发



每次新位置的坐标信息保存到txt中都会把上一次的坐标信息给覆盖掉,上次写入文件的x,y是被覆盖掉了吗?
package 图形界面_HelloSwing;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;

import javax.swing.JFrame;

public class SavingPostionThread extends Thread{
	private JFrame frame;
	File file=new File("H://How2j//图形界面//src//图形界面_HelloSwing//坐标.txt");
	SavingPostionThread(JFrame frame){
		this.frame=frame;
	}
	
	public void run() {
		while (true) {
			int x=frame.getX();
			int y=frame.getY();
			try (FileOutputStream fos=new FileOutputStream(file);DataOutputStream dos=new DataOutputStream(fos)){
				dos.writeInt(x);
				dos.writeInt(y);
				
			} catch (Exception e) {
				// TODO: handle exception
			}
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
	}
}

							


1 个答案

asdqq7 答案时间:2019-05-15
new FileOutputStream(file,true)这样就不会删除原来的东西的。后面加多一个 true



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2019-04-21 交作业(一),欢迎暂时没思路的朋友来交流参考
simple_曹泽



随时欢迎交流、指正,感谢! /* * 需求一:把110@120形式的两个数字用缓存流写入到文件中,再用缓存流从文件中读出来,并解析成两个数字 * 思路:同需求 * 需求二:把110和120两个数字直接用DataInputStream写入,再用DataOutputStream读出 * 思路:同需求 */ 个人学习博客:https://blog.csdn.net/hui1setouxiang 欢迎交流指正,内容是根据版主推荐的《Core Java》写的一些关键章节(内部类、lambda表达式、String类、集合等)的总结。 预计IO流这一章节的思维导图会在5月前发布,敬请关注~ 祝您生活顺心,学习愉快,共勉~
package io;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/*
 * 	需求一:把110@120形式的两个数字用缓存流写入到文件中,再用缓存流从文件中读出来,并解析成两个数字
 * 	思路:同需求
 *	需求二:把110和120两个数字直接用DataInputStream写入,再用DataOutputStream读出
 *	思路:同需求
 */
public class DataStreamDemo {
	private static final String NUM_COMB = "110@120";
	private static final int FIRST_NUM = 119;
	private static final int LAST_NUM = 114;

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		File file = new File("DataStreamDemo.txt");
		try {
			makeSureFileExists(file);

			pWrite(file);
			bRead(file);

			dWrite(file);
			dRead(file);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private static void makeSureFileExists(File file) throws IOException {
		if (file.exists())
			file.delete();
		if (null != file.getParentFile())
			file.getParentFile().mkdirs();
		file.createNewFile();
	}

	// 通过缓存流从文件中读取出内容,并解析出数字、最后打印
	private static void bRead(File file) throws IOException {
		try (FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr)) {
			String line = br.readLine();
			String[] split = line.split("@");
			System.out.println("BufferedReader first number:" + Integer.parseInt(split[0]));
			System.out.println("BufferedReader last number:" + Integer.parseInt(split[1]));
		}
	}

	// 通过缓存流写到文件中
	private static void pWrite(File file) throws IOException {
		try (FileWriter fw = new FileWriter(file); PrintWriter pw = new PrintWriter(fw)) {
			pw.print(NUM_COMB);
		}
	}

	// 通过数据流从文件中读取出两个数字,打印出来
	private static void dRead(File file) throws IOException {
		try (DataInputStream din = new DataInputStream(new FileInputStream(file))) {
			System.out.println("DataInputStream first number:" + din.readInt());
			System.out.println("DataInputStream last number:" + din.readInt());
		}
	}

	// 通过数据流写到文件中
	private static void dWrite(File file) throws IOException {
		try (DataOutputStream dout = new DataOutputStream(new FileOutputStream(file))) {
			dout.writeInt(FIRST_NUM);
			dout.writeInt(LAST_NUM);
		}
	}
}

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2019-04-18 交作业,问题:用数据流读写都正常,但文件里面都是乱码怎么解释呢?
2019-04-12 什么顺序写什么顺序读也太蠢了吧
2019-04-11 作业
2019-03-18 交作业
2019-03-10 用数据流如果想要把数据按INT,BOOLEAN,STRING的方式全部读完该怎么办?用循环来读数据的话要加什么结束条件?
2019-01-25 交作业
2019-01-23 交作业了
2019-01-22 交作业咯
2018-12-08 作业
2018-12-01 作业
2018-11-25 交作业
2018-11-18 交作业
2018-11-18 交作业
2018-11-05 交作业
2018-09-09 作业!
2018-08-01 关于flush()的问题,求大神解答
2018-07-30 作业
2018-07-29 交作业
2018-07-23 作业
2018-06-08 程序运行时不断的往本地写入窗口的位置信息,一直写,为什么不需要删除旧的数据,本地txt文件内还能保持只有一个位置信息?
2018-05-02 能不能告诉我PrintWriter write方法和print方法的区别
2018-03-01 同时创建输入输出流的问题
2017-12-15 发现一点:read()中的dis.readInt() readUTF()等等顺序必须和write()中写入的顺序一致,才能正确读出来,否则就会出错,站长这是为啥??
2017-12-02 为什么用数据流输入的文件,用字节流读出都是0呢?
2017-11-28 步骤3练习题的代码中残留了上一节read()write()的内容
2017-11-07 读入的值不对
2017-08-04 乱码问题
2017-07-28 作业,为什么TXT里出现的是乱码啊




提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-I/O-数据流 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 1001964108
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图