Java学习回忆录-基础语法-输入输出
Java.io包几乎包含了所有操作输入、输出需要的类。但是这主要记录控制台的输入输出。
控制台的输入输出
举例:从控制台获取成绩然后输出成绩属于的等级。
package Practices.Basic;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BrReadAndWrite {
public static void main(String[] args) throws IOException {
// 使用 System.in 创建 BufferedReader
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入学生成绩:");
String read = reader.readLine(); // 数字不止一位,读取时以字符串的形式读取
double score = Double.valueOf(read.toString()); // 强转成double类型
printGrade(score);
}
public static void printGrade(double score) {
if (score >= 90.0) {
System.out.println('A');
}
else if (score >= 80.0) {
System.out.println('B');
}
else if (score >= 70.0) {
System.out.println('C');
}
else if (score >= 60.0) {
System.out.println('D');
}
else {
System.out.println('F');
}
}
}
踩坑之一:之前使用reader.read()去读取输入,这方法读取的是字符的ASC编码,导致晕圈了一会。而且read()方法它的返回值的不是字符,要显示字符只能强转成字符。
Java Scanner 类
我们可以通过 Scanner 类来获取用户的输入。 使用Scanner 类的 next() 与 nextLine() 方法获取输入的字符串,在读取前我们一般需要 使用 hasNext 与 hasNextLine 判断是否还有输入的数据。
**next()与nextLine()区别 **
next():
- 1. 一定要读取到有效字符后才可以结束输入。
- 2. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
- 3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- 4. next()不能得到带有空格的字符串。
nextLine():
- 1. 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
- 2. 可以获得空白。
示例:
package Practices.Basic;
import java.util.Scanner;
/**
* 输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出执行结果
*/
class ScannerDemo{
public static void main(String[] args){
Scanner scan = new Scanner(System.in); // 获取scanner对象
double sum = 0; // 记录和
int m = 0; // 记录输入了多少个数
while(scan.hasNextDouble()){ // 判断时候还有Double类型的数据输入
double x = scan.nextDouble();
m = m + 1;
sum = sum + x;
}
System.out.println(m+"个数的和为"+sum);
System.out.println(m+"个数的平均值是"+(sum/m));
}
}
文件(File)的输入输出
java文件的输入输出流层级关系如下:
**FileInputStream **
该流用于从文件读取数据,它的对象可以用关键字new来创建。
有多种构造方法可用来创建对象。
**InputStreamReader
简介 **
InputStreamReader
是字符流Reader
的子类,是字节流通向字符流的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。一次只读一个字符。
**FileOutputStream **
该类用来创建一个文件并向文件中写数据。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建FileOutputStream 对象。
**OutputStreamWriter
简介 **
OutputStreamWriter
是字符流Writer
的子类,是字符流通向字节流的桥梁。每次调用 write()
方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。一次只写一个字符。
举例:
package Practices.Basic;
import java.io.*;
public class FileReadAndWrite {
public static void main(String[] args) throws IOException {
File f = new File("test.txt"); // 新建一个文件
FileOutputStream outputStream = new FileOutputStream(f); // 开启一个文件的输出流,注意这里需要抛出异常或者try-catch
// OutputStreamWriter是从字符流到字节流的桥接:使用指定的字符集将写入其中的字符编码为字节。
OutputStreamWriter writer = new OutputStreamWriter(outputStream, "utf-8");
FileInputStream inputStream = new FileInputStream(f); // 开启一个文件的输入流
// InputStreamReader是从字节流到字符流的桥接:提前从底层流读取更多的字节,使其超过满足当前编码格式所需的字节,然后转换成字符输出。
InputStreamReader reader = new InputStreamReader(inputStream, "utf-8");
writer.append("中文输入"); // 数据先写入到缓冲区,之后刷新缓冲区时才会写入文件中
writer.append("\r\n");
writer.append("English");
// 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
writer.close(); // 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
outputStream.close(); // 关闭输出流,释放系统资源
StringBuffer sb = new StringBuffer();
while (reader.ready()) {
sb.append((char) reader.read()); // 转成char加到StringBuffer对象中
}
System.out.println(sb.toString());
reader.close(); // 关闭读取流
inputStream.close(); // 关闭输入流,释放系统资源
}
}
字节数组的输入和输出
Java ByteArrayInputStream类
字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中。
Java ByteArrayOutputStream类
字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。
package Practices.Basic;
import java.io.*;
public class ByteStreamTest {
public static void main(String args[])throws IOException {
// 创建一个字节数组输出流,后面参数为缓冲区大小(单位字节)
ByteArrayOutputStream boutputStream = new ByteArrayOutputStream(12);
while(boutputStream.size() < 10){
boutputStream.write(System.in.read()); // 获取用户输入
}
byte[] bytes = boutputStream.toByteArray(); // 将读到的数据转换成数组
System.out.println("Print the content");
for(int x= 0 ; x < bytes.length; x++) { // 将转换后的数组打印出来
System.out.print((char)bytes[x] + " ");
}
boutputStream.close();
System.out.println();
int c;
// 创建一个字节数组输入流,以接收的数组大小来开辟内存缓冲区大小
ByteArrayInputStream binputStream = new ByteArrayInputStream(bytes);
System.out.println("Converting characters to Upper case " );
for(int y = 0 ; y < 1; y++ ) { // 循环读取数组里的每一个元素,读取完毕后得到的值为-1
while(( c= binputStream.read())!= -1) {
System.out.print(Character.toUpperCase((char)c) + " "); // 这里将读到的数据转成大写后输出
}
binputStream.close();
}
}
}
数据输出流和输入流
Java DataInputStream类
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
Java DataOutputStream类
数据输出流允许应用程序以与机器无关方式将Java基本数据类型写到底层输出流。
package Practices.Basic;
import java.io.*;
/**
* 从文本文件test.txt中读取5行,并转换成大写字母,最后保存在另一个文件test1.txt中。
*/
public class DataStreamTest{
public static void main(String args[])throws IOException {
DataInputStream d = new DataInputStream(new FileInputStream("test.txt"));
DataOutputStream out = new DataOutputStream(new FileOutputStream("test1.txt"));
String count;
while((count = d.readLine()) != null){
String u = count.toUpperCase();
System.out.println(u);
out.writeBytes(u + " ,");
}
d.close();
out.close();
}
}
这个了解一下吧,练习的时候,发现readline()方法都已经不推荐使用。所以简略的过。