字节字符流转换(自定义Scanner类),数据流的使用

Windows系统默认是GBK,占2个字节

Unicode中的UTF-8格式占3个字节

字符流中和编码解码相关的两个类

  • InputStreamReader:是从字节流到字符流的桥梁,父类是Reader,它读取字节,并使用指定的编码将其解码为字符。它使用的字符集可以由名称制定,也可以被明确指定,或者可以接受平台的默认字符集
  • OutputStreamWriter:是从字符流到字节流的桥梁,父类是Writer,使用指定的编码将写入的字符编码为字节。它使用的字符集可以由名称制定,也可以被明确指定,或者可以接受平台的默认字符集
方法名说明
InputStreamReader(InputStream in)使用默认字符编码创建InputStreamReader对象
InputStreamReader(InputStream in,String charset)使用指定的字符编码创建InputStreamReader对象
OutputStreamWriter(OutputStream out)使用默认字符编码创建outputStreamWriter对象
OutputStreamWriter(OutputStream out,String charset)使用指定的字符编码创建outputStreamWriter对象

字节流转字符流

package IO流.字节流和缓冲流;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;

public class 字节流转字符流 {

	public static void main(String[] args) {

		/**
		 * 从控制台读取一行
		 */

		InputStream input = System.in;
		InputStreamReader reader = new InputStreamReader(input);
		BufferedReader buffReader = new BufferedReader(reader);
		try {
			String name = buffReader.readLine();
			System.out.println("name is " + name);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				buffReader.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		/**
		 * 从数组读取
		 */

		try {
			// 读取10个字节
			byte[] bArray = new byte[10];
			input.read(bArray);

			// byte[]数组就是指多个字节!!!
			String name = new String(bArray);
			System.out.println("name is " + name);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				input.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

字符流转字节流

package IO流.字节流和缓冲流;

public class 字符流转字节流 {
	public static void main(String[] args) {

		// byte 字节
		// char 字符

		// 字符转字节
		String str = "asadddassa";
		byte[] byteArray = str.getBytes();

		// 字节转字符
//		byte[]  bArray = {22,33,44,55};
		String newStr = new String(byteArray);
		System.out.println(newStr);

	}
}

自定义MyScanner
底层还是InputStream

package io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class MyScanner {
	
	private InputStream input;
	
	public MyScanner(InputStream input){
		this.input = input;
	}
	
	
	
	public String next(){
		String value = null;
		
		InputStreamReader reader = new InputStreamReader(this.input);
		BufferedReader buffReader = new BufferedReader(reader);
		try {
			value = buffReader.readLine();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//		finally{
//			try {
//				buffReader.close();
//			} catch (IOException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//		}
		return value;
	}
	
	
	public int nextInt(){
		String value = this.next();
		return Integer.parseInt(value);
	}
	
	
	public double nextDouble(){
		String value = this.next();
		return Double.parseDouble(value);
	}
	
}

数据流的使用

package 其他衍生流;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class 数据流的使用 {
	
	public static void main(String[] args) {
		
		//以下有三个数据
//		String name = "张三";
//		int age = 18;
//		double height = 1.75;
//		String hobby = "无";
//		String no = "1001";
		
		
		数据流
		///作用:方便存取数据
		//写出
		//writeData(no, name, age, height, hobby);
		//读入
		readData();
		
		
		
		
	}
	
	
	/**
	 * 使用数据流写出到文件
	 * @param no
	 * @param name
	 * @param age
	 * @param height
	 * @param hobby
	 */
	public static void writeData(String no,String name,int age,double height,String hobby){
		DataOutputStream out = null;
		try {
			out = new DataOutputStream(new FileOutputStream("student.data"));
			//注意写出的顺序(写出的顺序要跟读入时的顺序保持一致)
			out.writeUTF(no);			//学号
			out.writeUTF(name);			//姓名
			out.writeInt(age);			//年龄
			out.writeDouble(height); 	//身高
			out.writeUTF(hobby);		//爱好
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			try {
				out.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	
	public static void readData(){
		DataInputStream input = null;
		try {
			input = new DataInputStream(new FileInputStream("student.data"));
			//注意读入的顺序(写出的顺序要跟读入时的顺序保持一致)
			String no = input.readUTF();			//学号
			String name = input.readUTF();			//姓名	
			int age = input.readInt();				//年龄
			double height = input.readDouble(); 	//身高
			String hobby = input.readUTF();			//爱好
			System.out.println("no is "+no);
			System.out.println("name is "+name);
			System.out.println("age is "+age);
			System.out.println("height is "+height);
			System.out.println("hobby is "+hobby);
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			try {
				input.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的自定义Scanner类的示例代码: ```java import java.io.InputStream; import java.util.InputMismatchException; import java.util.Scanner; public class CustomScanner { private InputStream inputStream; private StringBuilder buffer; public CustomScanner(InputStream inputStream) { this.inputStream = inputStream; this.buffer = new StringBuilder(); } public String next() { clearBuffer(); int c = read(); while (isWhiteSpace(c)) { c = read(); } while (!isWhiteSpace(c)) { buffer.append((char) c); c = read(); } return buffer.toString(); } public int nextInt() { try { return Integer.parseInt(next()); } catch (NumberFormatException e) { throw new InputMismatchException(); } } private void clearBuffer() { buffer.setLength(0); } private boolean isWhiteSpace(int c) { return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1; } private int read() { try { int c = inputStream.read(); return c; } catch (Exception e) { throw new InputMismatchException(); } } } ``` 这个自定义Scanner类包含了两个方法:`next()`和`nextInt()`。`next()`方法读取输入中的下一个字符串,`nextInt()`方法读取输入中的下一个整数。如果读取的字符串无法转换成整数,`nextInt()`方法会抛出一个`InputMismatchException`异常。 这个自定义Scanner类的实现方式与Java标准库中的`Scanner`类不同,它使用字符而不是字节,并且没有使用正则表达式。因此,它的性能可能比Java标准库中的`Scanner`类差一些。但是,它可以作为一个基础的自定义Scanner类的示例,供你参考和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值