0. 字节流与二进制文件
###我的代码
public class WriterStu {
public static void main(String[] args) {
DataOutputStream dos = null;
Student[] stus = new Student[100];
Student d1 = new Student(1, "x", 18, 99.5);
Student d2 = new Student(2, "x", 19, 100.0);
Student d3 = new Student(3, "x", 20, 59.5);
try (FileOutputStream fos = new FileOutputStream(new File("e:/Student.data"))) {
dos = new DataOutputStream(fos);
for (Student student : stus) {
dos.writeInt(student.getId());
dos.writeUTF(student.getName());
dos.writeInt(student.getAge());
dos.writeDouble(student.getGrade());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try (DataInputStream dis = new DataInputStream(new FileInputStream("e:/Student.data"))) {
int id = dis.readInt();
String name = dis.readUTF();
int age = dis.readInt();
double grade = dis.readDouble();
Student stu=new Student(id,name,age,grade);
System.out.println(stu);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
###我的总结 文本文件中的数据都是以字符的形式进行组织,通常可以逐行或全部读取到一个字符串变量中。二进制文件可以存储int/double/char等基本数据类型。
#1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) ###我的代码 ####4.
String fileName1="e:/data.txt";
try(
FileOutputStream fos=new FileOutputStream(fileName1);
ObjectOutputStream oos=new ObjectOutputStream(fos))
{
Student s=new Student(5,"l",12,85);
oos.writeObject(s);
}
catch (Exception e) {
e.printStackTrace();
}
try(
FileInputStream fis=new FileInputStream(fileName1);
ObjectInputStream ois=new ObjectInputStream(fis))
{
Student newStudent =(Student)ois.readObject();
System.out.println(newStudent);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
###我的总结 将对象流写在txt中会发生乱码,改为dat格式则不会发生乱码。
#2. 缓冲流(结合使用JUint进行测试) ###我的代码
public class PrintWriterTest {
public static void main(String[] args) throws FileNotFoundException {
File file = new File("e:/data.txt");
if(file.exists())
{
System.out.println("文件已存在!");
System.exit(0);
}
PrintWriter pw=new PrintWriter(file);
Random r=new Random(100);
for(int i=0;i<1000_0000;i++) {
int j=r.nextInt(11);
pw.println(j);
}
pw.close();
}
}
####JunitTest
public class JunitTest {
@Test
public void testBufferedReader() {
BufferedReader br = null;
int n = 0, sum = 0;
double average = 0;
try {
br = new BufferedReader(new FileReader("e:/data.txt"));
String line = null;
try {
while ((line = br.readLine()) != null) {
int num = Integer.parseInt(line);
n++;
sum += num;
}
average = sum / n;
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
System.out.format("%d %d %.5f", n, sum, average);
System.out.println();
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Test
public void testScanner() {
File file = new File("e:/data.txt");
Scanner sc = null;
int n = 0, sum = 0;
double average = 0;
try {
sc = new Scanner(file);
while (sc.hasNext()) {
int num = sc.nextInt();
sum+=num;
n++;
}
average = sum / n;
System.out.format("%d %d %.5f", n, sum, average);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
###我的总结 使用BufferedReader更快,BufferedReader使用缓冲可以减少IO次数,因为IO操作很耗时间,所以读取速度变快。
#3. 字节流之对象流 ###我的代码
public static void writeStudent(List stuList) {
String fileName = "e:/data.txt";
try (FileOutputStream fos = new FileOutputStream(fileName);
ObjectOutputStream ois = new ObjectOutputStream(fos)) {
ois.writeObject(stuList);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
public static List readStudents(String fileName) {
List stuList = new ArrayList<>();
try (FileInputStream fis = new FileInputStream(fileName); ObjectInputStream ois = new ObjectInputStream(fis)) {
stuList = (List) ois.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return stuList;
}
###我的总结 ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。
#5. 文件操作 ###我的代码
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Files {
Path dir=Paths.get("e:/data.txt");
public static void findFile(Path dir,String fileName) {
File file =dir.toFile();
File[] files =file.listFiles();
for(File file1:files) {
if(file1.isDirectory()) {
findFile(file1.toPath(),fileName);
}else {
if(file1.equals(new File(fileName))) {
System.out.println("Found:");
System.out.println(file1.getAbsolutePath());
}
}
}
}
}
###我的总结 File类和Path类可以相互转换,Paths类可以直接获得Path对象,不需要new Path。
#6. 正则表达式 ####判断一个给定的字符串是否是10进制数字格式 ###我的代码
import java.util.regex.Pattern;
public class testIsDigit {
public static void main(String[] args) {
System.out.println(isDigit("123a"));
System.out.println(isDigit("-123"));
System.out.println(isDigit("a123a"));
System.out.println(isDigit("123"));
System.out.println(isDigit("-"));
}
public static boolean isDigit(String s) {
return Pattern.matches("^-?\\d+$", s);
}
}
###我的总结 熟悉正则表达式的语法可以帮助我们更加简便得编写代码。