-
IO流(输入流、输出流) 字节流、字符流 1.字节流 1)InputStream、OutputStream InputStream抽象了应用程序 读取 数据的方式 OutputStream抽象了应用程序 写出 数据的方式 2)EOF = End 读到-1就读到结尾 3)输入流基本方法 下面的in代表了输入流的对象 int b = in.read(); 返回一个整数,读取一个字节 无符号填充到int低八位.-1是 EOF in.read(byte[] buf) 读取数据填充到字节数组buf in.read(byte[] buf,int start,int size) //读取数据到字节数组buf 从buf的start位置开始 存放size长度的数据 4)输出流基本方法 out.write(int b) 写出一个byte到流,b的低8位 out.write(byte[] buf)将buf字节数组都写入到流 out.write(byte[] buf,int start,int size) //字节数组buf从start位置 开始写size长度的字节到流 5)FileInputStream--->具体实现了在文件上读取数据 //本身继承了InputStream查看全部
-
RandomAccessFile : java提供的对文件内容的访问 既可以读文件 也可以写文件 支持随机访问文件 可以访问文件的任意位置 (1)java文件模型 : 在硬盘上的文件是byte byte byte 存储的 是数据的集合 (2)打开文件 有两种模式 rw 读写 r只读 RandomAccessFile raf=new RandomeAccessFile(file,"rw"); 文件指针, pointer=0; (3)写方法 raf.write(int) ----> 只写一个字节 (后8位) 同时指针指向下一个位置 准备再次写入 (4)读方法 int b=raf.read(); 读一个字节 (5)文件读写完成后一定要关闭 (oracle官方说明)查看全部
-
file.list() 返回当前目录下的子目录和文件的字符串数组名称 file.listFiles() 返回当前目录下的所有子目录和文件的文件数组名称 File[] files = dir.listFiles();//返回的是直接子目录(文件)的抽象 if (file!=null && files.length > 0){ for(File file:files){ //递归 if(file.isDrectory()){ listDirectory(file); }else{ System.out.println(file); } } }查看全部
-
File.separator这样实现linux、windows都认识 java.io.File类用于表示文件(目录) 程序员可以通过File类在程序中操作硬盘上的文件和目录 File类只用于表示文件(目录)的信息(名称,大小等),不能用于文件内容的访问 1.创建File对象:File file=new File(String path);注意:File.seperater();获取系统分隔符,如:”\“ 2.boolean file.exists();是否存在. 3.file.mkdir();或者file.mkdirs();创建目录或多级目录。 4.file.isDirectory()或者file.isFile()判断是否是目录或者是否是文件。 5.file.delete();删除文件或目录。 6.file.createNewFile();创建新文件。 7.file.getName()获取文件名称或目录绝对路径。 8.file.getAbsolutePath()获取绝对路径。 9.file.getParent();获取父级绝对路径。 10.file.getSize();获取文件大小。 11.file.getFormat();获取文件格式名。 File file=new File("E:\\javaio"); syso -> file.exist(); if (!file.exists()){ file.mkdir(); //如果不存在就建立一个 // file.mkdirs() 创建多级目录 else file.delete(); //存在就删除 syso -> (file.isDirectory()); // 是否是一个目录 syso -> (file.isFile()); // 是否是一个文件 File file2=new File("e:\\javaio\\日记1.txt"); or ("e:\\javaio","日记1.txt") if (!file2.exist()){ file2.createNewFile(); 捕捉异常 syso -> (file) // file.toString() 的内容 syso -> (file.getAboslutePath()); //上同 。查看全部
-
java是双字节编码 utf-16be 中文两个字节 英文两个字节 GBK中文占两个字节,英文1个字节;utf-8中文占三个字节,英文占1个字节。 文本文件,就是字节序列。可以是任意编码的字节序列,如果我们是在中文机器上直接创建文本文件,那么该文本文件只认识ANSI编码。(联通、联这是一种巧合,他们正好符合了utf-8编码的规则。) Eclipes中什么样子的编码项目就只认识该编码的文字,换一种编码就会出现乱码。 当你的字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码方式,否则会出现乱码 String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 String s="慕课ABC"; byte[] bytes1=s.getBytes(); //转换成字节序列用的是项目默认的编码gbk for (byte b:bytes1){ //把字节转换成了int 以16进制的方式显示 system.out.println(Integer.toHexString(b & 0xff)+" "); // c4 bd bf ce 41 42 43 } byte[] bytes2=s.getBytes("gbk"); //手动定义用gbk编码 效果相同 但会有异常 中文两个字节 英文一个 byte[] bytes3-s.getBytes("utf-8"); // e6 85 95 e8 af be 中文三个字节 英文一个 //java是双字节编码 utf-16be 中文两个字节 英文两个字节 byte[] byte4=s.getBytes("utf-16be"); String str1=new String(bytes4); //会出现乱码 当你的字节序列是某种编码时,这个时候把自己序列变成字符串,也需要用这种编码方式,否则会出现乱码 String str2=new String(bytes4,"utf-16be"); //这样就不会出现乱码了查看全部
-
序列化过程中子父类构造函数问题 一、父类实现了serializable接口,子类继承就可序列化。 1、子类在反序列化时,父类实现了序列化接口,则不会递归调用其构造函数。 二、父类未实现serializable接口,子类自行实现可序列化 2、子类在反序列化时,父类没有实现序列化接口,则会递归调用其构造函数。 *** 结论:【反序列化时】,向上递归调用构造函数会从【可序列化的一级父类结束】。即谁实现了可序列化(包括继承实现的),谁的构造函数就不会调用。查看全部
-
序列化过程中子父类构造函数问题 一、父类实现了serializable接口,子类继承就可序列化。 1、子类在反序列化时,父类实现了序列化接口,则不会递归调用其构造函数。 二、父类未实现serializable接口,子类自行实现可序列化 2、子类在反序列化时,父类没有实现序列化接口,则会递归调用其构造函数。 *** 结论:【反序列化时】,向上递归调用构造函数会从【可序列化的一级父类结束】。即谁实现了可序列化(包括继承实现的),谁的构造函数就不会调用。 [ 收起全文 ]查看全部
-
1.transient 关键字:被transient修饰的元素,该元素不会进行jvm默认的序列化 注意:在以后的网络编程中,如果有某些元素不需要传输,那就可以用transient修饰,来节省流量;有效数据序列化,无效数据就不需要序列化了,提高效率 2.被transient修饰的元素,不能进行默认的序列化,但可以自己完成这个元素的序列化 transient关键字修饰的属性默认是不能序列化的,但是可以使用writeObject自己完成这个元素的序列化。ArrayList就是用了此方法进行了优化操作。ArrayList最核心的容器Object[] elementData使用了transient修饰,但是在writeObject自己实现对elementData数组的序列化。只序列化实际有的元素,对于数组中空的元素不进行序列化。 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException private void readObject(java.io.ObjectInputStream s) throws java.io.IOException,ClassNotFoundException查看全部
-
IO——对象的序列化和反序列化 一、概念 1、对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化 2、序列化流(ObjectOutputStream),字节的过滤流 —— writeObject()方法 反序列化流(ObjectInputStream) —— readObject()方法,读出来是object类 记得转换 3、序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常。 这个借口,没有任何方法,只是一个【标准】查看全部
-
字符流的过滤器: BufferedReader readLine 一次读一行 BufferedWriter/PrintWriter 写一行 BufferedReader br=new BuffereReader( new InputStreamReader (new FileInputStream("e:\\javaio\\imooc.txt"))); BufferedWRiter bw=new BufferedWriter( new OutputSteamWriter( new FileOutputStream("e:\\javaio\\immoc3.txt"))); PrintWriter pw=new PrintWriter("e:\\javaio\\imooc4.txt"); String line; while ((line=br.readLine())!=null){ syso -> line; bw.write(line); bw.newLine(); //换行操作 bw.flush(); //或 pw.print(line); // pw.println(line); pw.flush(); } br.close(); bw.close(); pw.close()查看全部
-
2.字符流 (操作的是文本 文本文件) 注意默认的编码方式 1)编码问题 2)认识文本和文本文件 java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码) 文件是byte byte byte 的数据序列 文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化byte的存储 3)字符流(Reader Writer) 字符的处理,一次处理一个字符 字符的底层依然是基本的字节序列 4)InputStreamreader 完成byte流解析成char流 按照编码解析 OutputStreamWrite 提供char流到byte流 按照编码处理 FileInputStream in=new FileInputStream("e:\\javaio\\imooc.txt"); InputSreamStreamReader isr=new InputStreamReader(in);//默认项目编码 gbk 可改成 utf-8 int c; while((c=isr.read())!=-1){ syso -> char(c) } //一次读一个字符数组 char[] buffer=new char[8*1024]; int c; while ((c=isr.read(buffer,0,buffer.length))!=-1){ 批量读取放入buffer这个字符数组 从第0个位置开始防止,最多放置buffer.length个 String s=new String(buffer,0,c); syso -> s; }查看全部
-
BufferedInputSteram和BufferedOutputStream: 提供了带缓冲区的操作,一般打开文件进行写入或读取时,都会加上缓冲,提高了IO的性能。 FileOutputStream--->write()一滴一滴写 DataOutputStream--->writeXXX()相当与一瓢一瓢的写 BufferedOutputStream--->write()相当于一瓢一瓢先放入桶中,然后一整桶写 使用BufferedInputSteram和BufferedOutputStream时,要到用flush()刷新缓冲区。查看全部
-
readInt readLong 方法都是对FileInputStream方法的包装 DataOutputStream/DataInputStream 对“流”功能的扩展,可以更加方便的读取 int,long, 字符等类型数据 DataOutputStream:使用FileOutputStream构造出来,通过包装FileOutput,可以调用FileOutput类的write方法来构造新的更方便的写方法: new DataOutputStream(new FileOutptStream(file)) wrieteUTF()采用utf-8编码写出字符串 用utf-16be写出字符串,或字符串数组 写完之后一定要关闭流 数据输入输出流: DataInputStream、DataOutputStream 是对“流”功能的扩展,方便读写 DataOutputStream dos = new DataOutputStream(new FileOutputStream(file)); dos.writeInt(10); dos.writeLong(10l);字母l dos.writeDouble(10.5); //采用utf-8编码写出 dos.writeUTF("中国"); //采用utf-16be编码写出 dos.writeChars("中国");查看全部
-
/** * 文件拷贝,字节批量读取 * @param srcFile * @param destFile * @throws IOException * * JAVA的throw和throws區別: * http://zhidao.baidu.com/link?url=cOoyefusSFJRvXFuNK3vAVS_mGcE3jgWSy8CiwZk5y-N8Fa-m_cwRrNVEneXKkwMOTYHz8MIIS13gAz91Y4vZ_ */ public static void copyFile(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); byte[] buf = new byte[8*1024]; int b ; while((b = in.read(buf,0,buf.length))!=-1){ //講buf數組裡的內容讀入到該輸出流中(out) out.write(buf,0,b); out.flush();//最好加上 } in.close(); out.close(); }查看全部
-
1、byte 类型 8 位,int 类型 32 位,为了避免数据转换错误,通过 & 0xff 将高 24 位清零 2、long time = System.currentTimeMillis() 当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量) 3、is.read() 单字节适合读取 小 文件 is.read(byte[] bytes,int star,int size) 字节数组适合读取 大 文件查看全部
举报
0/150
提交
取消