-
在中文机器上直接创建文本文件,那么该文本文件只认识ansi编码查看全部
-
主要流程查看全部
-
对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化。 要实现Serializable接口 transient关键字修饰:不被JVM序列化,但是可以自定义序列化。 自定义序列化需要重写两个方法,如下: private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException<br> { s.defaultWriteObject();//实现JVM默认属性的序列化 s.writeXXX(xxx);//完成自定义的属性序列化 } private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject();//实现JVM默认属性的反序列化 this.xxx = s.readXXX();//完成自定义的属性反序列化 }查看全部
-
transient及ArrayList源码分析 I public static void main(String[] args) throws Exception{ String file = "demo/obj.dat"; //1.对象的序列化 /*ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(file)); Student stu = new Student("10001", "张三", 20); oos.writeObject(stu); //这里为何会调用到Student类里的writeObject()方法,因为ObjectOutputStream父类是Object类,自然而然,Object类是所有类的隐含父类,重写了writeObject方法。注意自定义的类也属于Object类。 oos.flush(); oos.close();*/ ObjectInputStream ois = new ObjectInputStream( new FileInputStream(file)); Student stu = (Student)ois.readObject(); System.out.println(stu); ois.close(); }查看全部
-
utf-8 3 1<br> utf-16be 2 1<br> gbk 2 2 Java编程专用查看全部
-
GBK,中文占两个字节,英文占一个字节,UTF-8,中文占用三个字节,英文还是一个字节查看全部
-
中文占两个字节,英文占一个字节查看全部
-
FileReader和FileWriter不能增加编码参数,所以当项目和读取文件编码不同时,就会产生乱码。 这种情况下,只能回归InputStreamReader和OutputStreamWriter。 BufferedReader -- > readLine -> 读一行 不识别换行符,不会自动换行 BufferedWriter/PrintWriter -- > writeLine/println -> 写一行,不会自动换行/自动换行 在文件中换行,可以用newLine();实现查看全部
-
字符流 一、 Reader/Writer 操作的大多是文本文件;默认按照项目的编码解析(父类,抽象类) (1)InputStreamReader/OutputStreamWriter 提供char流与byte流相互转换(子类) 字符流的过滤器(缓冲流): 1.BufferedReader -- > readLine 读一行 不识别换行符,不会自动换行 ps:在文件中换行,可以用newLine();实现 2.BufferedWriter/PrintWriter -- > writeLine/println 写一行,不会自动换行/自动换行 (2)FileReader/FileWriter 适用于操作文件,但无法选择编码方式,用法与InputStreamReader和OutputStreamWriter类似 二、 EOF=End 及文件结尾(in.read()=-1) 三、 输入流基本方法 read(); 四、 输入流基本方法 read(); 字符流的过滤器: BufferedReader--》readLine 一次读一行 BufferedWriter/printWriter--》写一行 代码:对文件进行读写操作 BufferedReader br=new BufferedReader( new InputStreamReader( new FileInputStream(文件路径))); String line; while((line=br.readLine()!=-1){ System.out.print(line);//一次读一行,不能识别换行} 写操作将读操作改写即可 然后用bw.write(line);写到文件中,但是写的时候不会换行,所以要加一个换行操作 写操作方法二: printwrite pw= new printwrite(文件路径/outputStream); pw.print(line);查看全部
-
缓冲字节流这一节希望重新录更正错误,使用缓冲字节流复制确实是最快的方式,但对于小文件10M以下的文件体现不出优势,对于百兆文件正确使用,时间可以控制到50ms内。视频中的缓冲字节流使用有错误,复制文件最快的做法是将批量读取到的字节数组使用缓冲写入到文件,在机器性能范围内字节数组越大越快。在循环写入的过程中不需要使用flush,就像cwt8805说的,缓冲输入流在关闭的时候会将所有缓冲区的数据全部写入文件,使用flush刷新缓冲就失去了缓冲的意义。最后关闭IO流和文件流应该在finally中关闭,否则IO异常时执行不到close语句,IO流仍然没有关闭。 java 文件写入: 1,创建需要写入的字符串 2,创建文件句柄:File file = new File("文件路径") 3,判断文件是否存在,如果不存在就创建!:if(file.exists()) { file .createNewFile() } 4,创建读取对象:FileWriter fw = new Filewriter( file.getAbsoluteFile()); 5, 创建缓存对象 接收读取对象:BufferedWriter bf = new BufferedWriter(fw); 6, 缓存对象的写入方法,并调用声明的需要写入的字符串对象:bf.Writer(声明的需要写入的字符串对象) 7,关闭缓存写入对象: bf.close(); 8, 注意此处应有IO对象的异常需要捕获!查看全部
-
字节流 一、 InputStream、OutputStream 抽象了应用程序读写数据方式(父类,抽象类) FileInputStream、FileOutputStream 具体的实现了在文件中读写数据(子类) (1)DataOutputStream&DataInputStream 对"流"功能的扩展,可以更加方便的读取int,long,字符等类型数据 DataOutputStream --- writeInt()/writeDouble()/writeUTF() (2)BufferedInputStream&BufferedOutputStream 提供了带缓冲区的操作,提高了IO的性能 三者对比: FileOutputStream--->write()方法相当于一滴一滴地把水“转移”过去 DataOutputStream-->writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移”过去 BufferedOutputStream--->write方法更方便,相当于一飘一瓢先放入桶中,再从桶中倒入到另一个缸中,性能提高了 二、 EOF=End 及文件结尾(in.read()=-1) 三、 输入流基本方法 read(); int b=in.read();//读取一个字节无符号填充到int的低八位,返回读取的长度,-1是EOF;适合读取小文件 in.read(byte[] buf);//读取数据填充到字节数组buf in.read(byte[] buf,int start,int size);//同上,从buf的start位置开始存放size长度的数据,适合读取大文件 四、 输出流基本方法write(); out.write(int b); //写出一个byte到流,b的低八位 out.write(byte[] buf);//将buf字节数组都写入到流 out.write(byte[] buf,int start,int size);//同上,详见read对应方法查看全部
-
randomAccessFile: 1、java提供对文件内容的访问,即读写文件,支持随机访问文件及访问文件的任意位置 java文件模型:在硬盘上的文件是byte存储是数据的集合 2、打开文件:rw 读写 r 只读 RandomAccessFile raf=new RandomAccessFile (file,"rw") 存在一个指针,打开文件是指针头在0 pointer=0; 3、写方法:raf.write(int)--》只写一个字节(后8位),同时指针指向下一个位置,准备再次写入 4、读方法: int b=raf.read()--》读一个字节 5、文件读写完成后一定要关闭 代码: file demo=new file(“demo”);//demo路径 if(!demo.exists()){ demo.mkdir();} File file= new file(demo,"raf.dat"); if(!file.exists()) file.creatNewFile(); RandomAccessFile raf= new RandomAccessFile (file,“rw”); raf.write('A'); raf.write('B'); System.out.print(raf.getFilePointer);//获取指针 //write一个整数 int i=10; raf.writeInt(i); //写一个字符串 String s="中"; byte[] gbk=s.getBytes(“gbk”); raf.write(gbk); //读文件,必须把指针移动头 raf.seek(0); //一次性读取 byte[] buf=new byte[(int)raf.length()]; raf.read(buf); System.out.print(Arrays.toString(buf)); raf.close();查看全部
-
PrintWriter比BufferedWriter构造方法要简单查看全部
-
自己完成反序列化操作(关键是从ArrayList中找函数签名)查看全部
-
序列化过程中子父类构造函数问题 一、父类实现了serializable接口,子类继承就可序列化。 1、子类在反序列化时,父类实现了序列化接口,则不会递归调用其构造函数。 二、父类未实现serializable接口,子类自行实现可序列化 2、子类在反序列化时,父类没有实现序列化接口,则会递归调用其构造函数。 *** 结论:【反序列化时】,向上递归调用构造函数会从【可序列化的一级父类结束】。即谁实现了可序列化(包括继承实现的),谁的构造函数就不会调用。查看全部
举报
0/150
提交
取消