how2j.cn


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


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



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



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

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

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

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

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


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

但是用数据流就不需要,挨个挨个读就行了。
答案-向文件中写入两个数字,然后把这两个数字分别读取出来
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公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2024-07-07 一种鲁棒性能较好的根据指定类型/方式读取文件的方法
虚心求学




1.根据数据,判断数据类型并以该类型读写文件。 Boolean、Interger、String、Char、Byte 2.根据枚举,判断读取方式并以该方式读写文件。 enum ReadWays{ _bool, _int, _String, _char, _byte } 3.根据数组,遍历读取数组中匹配的读取方式或类型读写文件。
加载中
import javax.annotation.processing.Filer;
import javax.lang.model.element.Element;
import javax.sound.sampled.LineListener;
import javax.swing.text.html.HTMLDocument.HTMLReader.IsindexAction;

import Animal.Fish;
import j2se.HelloWorld;
enum ReadWays{
	_bool,
	_int,
	_String,
	_char,
	_byte
}
public class TestFile {

	public static void main(String[] args) {
		Object[] contents = { true, 128, "顺序测试,布尔值true、整数128、字符串str", '!' };
		Object[] readway = {ReadWays._bool,ReadWays._int,ReadWays._String,ReadWays._char};
		String path = "E:/wgxFolder/newTest.txt";
		// 方式一(普通读取、写入)
		System.out.println("方式一:");
		writeFile(path, "31@15");
		readFile(path, "@");

		// 方式二(传参为Object...ways)
		System.out.println("\r\n\r\n方式二:");
		writeFile(path, 31,15);
		readFile(path, ReadWays._int,ReadWays._int);

		
		// 方式二继续测试(传参为数组)
		System.out.println("\r\n\r\n方式二继续测试:");
		writeFile(path, contents);
		readFile(path,readway );
		// readFile("E:/test.txt");
	}
	
	/*根据读取方式的枚举,读取指定路径下文件的内容
	 * */
	public static char[] readFile(String path, Object...readWays) {
		File f = new File(path);
		try (DataInputStream dis = new DataInputStream(new FileInputStream(f))) {
			System.out.println("读取结果如下");
			for (Object obj : readWays) {
				if(obj instanceof Object[])
				{
					for (Object arr : (Object[])obj) {
						MatchWayRead(arr, dis);
					}
				}else
				MatchWayRead(obj, dis);
			}

		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(e.getMessage());
			// TODO: handle exception
		}
		return null;

	}
	
	/*匹配读取方式对应的读取类型,并以该读取类型读取指定路径下的文件的内容
	 * */
	private static void MatchWayRead(Object obj,DataInputStream dis)
	{
		String[] type = obj.getClass().getTypeName().split("\\.");
		String typeName = type[type.length-1];
		if(typeName.equals("ReadWays"))typeName = ((ReadWays)obj).toString().replace("_", "");
		try {
			if (obj instanceof Boolean||obj instanceof ReadWays&&((ReadWays)obj)==ReadWays._bool) {
				boolean bool = dis.readBoolean();
				System.out.println(String.format("%s(%s) ",String.valueOf(bool), typeName));
			} else if (obj instanceof Integer||obj instanceof ReadWays&&((ReadWays)obj)==ReadWays._int ) {
				int i = dis.readInt();
				System.out.println(String.format("%s(%s) ", String.valueOf(i), typeName));
			} else if (obj instanceof String||obj instanceof ReadWays&&((ReadWays)obj)==ReadWays._String) {
				String str = dis.readUTF();
				System.out.println(String.format("%s(%s) ", str, typeName));
			} else if (obj instanceof Byte||obj instanceof ReadWays&&((ReadWays)obj)==ReadWays._byte) {
				byte b = dis.readByte();
				System.out.println(String.format("%s(%s) ", String.valueOf(b), typeName));
			} else if (obj instanceof Character||obj instanceof ReadWays&&((ReadWays)obj)==ReadWays._char) {
				char c = dis.readChar();
				System.out.println(String.format("%s(%s)", String.valueOf(c), typeName));
			}
		} catch (Exception e) {
			e.printStackTrace();
			// TODO: handle exception
		}
		
	}

	/*指定分隔符,将指定路径文件的每行内容按分隔符(splitCharacter)拆分读取,
	      如果分隔符为null,则不拆分*/
	public static void readFile(String path, String splitCharacter) {
		File file = new File(path);
		System.out.println("读取结果如下");
		try (InputStreamReader isr = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
				BufferedReader br = new BufferedReader(isr)) {
			String line = "";
			while ((line = br.readLine()) != null) {
				if (line.equals(""))
					continue;
				if (splitCharacter != null) {
					String[] strs = line.split(splitCharacter);
					for (String str : strs) {
						System.out.print(str + " ");
					}
				} else
					System.out.println(line);

			}
		} catch (Exception e) {
			e.printStackTrace();
			// TODO: handle exception
		}
	}
	/*将字符串内容(contents),写入指定路径的文件中
	 * */
	public static void writeFile(String path, String contents) {
		File file = new File(path);
		try (OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);
				PrintWriter pw = new PrintWriter(isr)) {
			pw.write(contents + "\r\n");
			pw.flush();
		} catch (Exception e) {
			e.printStackTrace();
			// TODO: handle exception
		}
	}
	/*匹配写入内容(contents)的类型(type),并以该类型写入到指定路径下的文件中
	 * */
	public static void writeFile(String path, Object...contents) {
		File f = new File(path);
		if (!f.exists()) {
			f.getParentFile().mkdirs();
		}
		try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(f))) {
			// dos.writeBoolean(true);
			// dos.writeInt(128);
			// dos.writeUTF("顺序测试,布尔值true、整数128、字符串str");
			for (int i = 0; i < contents.length; i++) {
				Object obj = contents[i];
				if(contents[i] instanceof Object[])
					for (Object value : (Object[])obj) {
						matchWaysWrite(value, dos);
					}
				else 
					matchWaysWrite(obj, dos);
			}
		} catch (Exception e) {
			e.printStackTrace();
			// TODO: handle exception
		}
	}
	/*匹配当前对象的实例(obj)的对象类型,根据对象类型对应写入方式,
	 * 写入到指定路径下的文件中
	 * */
	private static void matchWaysWrite(Object obj,DataOutputStream dos)
	{
		try {
			if (obj instanceof Boolean) {
				dos.writeBoolean((boolean) obj);
				//System.out.print((boolean) obj + " ");
			} else if (obj instanceof Integer) {
				dos.writeInt((int) obj);
				//System.out.print((int) obj + " ");
			} else if (obj instanceof String) {
				dos.writeUTF((String) obj);
				//System.out.print((String) obj + " ");
			} else if (obj instanceof Byte) {
				dos.writeByte((Byte) obj);
				//System.out.print((Byte) obj + " ");
			} else if (obj instanceof Character) {
				dos.writeChar((char) obj);
				//System.out.print((char) obj + " ");
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		
	}
}

							





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





2023-12-31 数据流和缓冲流两个题的答案
javanoobbbb




数据流和缓冲流两个题的答案
import java.io.*;

public class practice1 {
    public static void main(String[] args) {
        int m=51,n=31;
        File file = new File("C:/Users/ASUS/desktop/goal.txt");//C:\Users\ASUS\Desktop\goal.txt
        if (file.exists())
        {
            String str=String.valueOf(m)+"@"+String.valueOf(n);
            try (FileWriter fileWriter=new FileWriter(file); BufferedWriter bufferedWriter=new BufferedWriter(fileWriter)){
                bufferedWriter.write(str);
                bufferedWriter.flush();
                System.out.println("数字存入成功");
            }
            catch (IOException e)
            {
                e.printStackTrace();

            }

            try (FileReader fileReader=new FileReader(file);BufferedReader bufferedReader=new BufferedReader(fileReader))
            {
                str=bufferedReader.readLine();
                String[] myMath=str.split("@");
                System.out.println("数字读取成功:");
                System.out.printf("number1: %d  number2: %d%n",Integer.parseInt(myMath[0]),Integer.parseInt(myMath[1]));
            }
            catch (IOException e)
            {
                e.printStackTrace();

            }
            }

    }
}
class paractice2{//数据输入输出流
    public static void main(String[] args) {
        int m=51,n=31;
        File file=new File("C:/Users/ASUS/desktop/goal.txt");
        try (DataInputStream inputStream=new DataInputStream(new FileInputStream(file));
             DataOutputStream dataOutputStream=new DataOutputStream(new FileOutputStream(file)))
        {
            dataOutputStream.writeInt(m);
            dataOutputStream.writeInt(n);
            dataOutputStream.flush();
            System.out.println("数据流存入成功");
           int []mymath=new int[2];
            mymath[0]=inputStream.readInt();
            mymath[1]=inputStream.readInt();
            System.out.println("数据读取成功");
            System.out.printf("number1: %d  number2: %d%n",mymath[0],mymath[1]);

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

							





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





2023-03-23 练习记录
2022-07-26 DataOutputStream
2022-05-25 答案


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 33 条以前的提问,请 点击查看

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

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

上传截图