Java学习 之 IO流(字节流、字符流)
1 /* 2 3 字节输出流: OutputStream 4 5 OutputStream是抽象类,表示输出字节流的所有类的超类,操作的数据都是字节 6 7 void close()关闭此输出流并释放与此流有关的所有系统资源 8 9 void flush()刷新此输出流并强制写出所有缓冲的输出字节 10 11 void write(byte[] b) 将b.length个字节从指定的byte数组写入此输出流 12 13 void write(byte[] b , int off , int len)将指定byte数组从偏移量off开始的len个字节写入此输出流 14 15 abstract void write(int b)将指定的字节写入此输出流 16 17 FileOutputStream类即文件输出流,用于将数据写入File的输出流 18 19 FileOutputStream(Fille file)创建一个指定File对象表示的文件中写入数据的文件输出流 20 21 FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流 22 23 */ 24 25 public class FileOutPutStreamDemo{ 26 27 public static void main(String[] args){ 28 29 //创建存储数据的文件 30 31 File file = new File("c:\\a.txt"); 32 33 //创建一个用于操作文件的字节输出流对象,一创建就必须明确数据存储的目的地 34 35 //输出流目的是文件,会自动创建。如果文件存在,则覆盖 36 37 FileOutputStream fos = new FileOutputStream(file); 38 39 //调用父类的write方法 40 41 byte[] b = "abcde".getBytes(); 42 43 fos.write(b); 44 45 //关闭流资源 46 47 fos.close(); 48 49 } 50 51 } 52 53 /* 54 55 文件续写和换行 56 57 FileOutputStream(File file , boolean append)创建一个向指定File对象表示的文件中写入数据的文件输出流 58 59 FileOutputStream(String name , boolean append)创建一个向指定name的文件中写入数据的文件输出流 60 61 */ 62 63 public class FileOutputStreamDemo2{ 64 65 public static void main(String[] args){ 66 67 File file = new File("c:\\a.txt"); 68 69 FileOutputStream fos = new FileOutputStream(file , true); 70 71 String str = "\r\n" +"ab"; 72 73 fos.write(str.getBytes()); 74 75 fos.close(); 76 77 } 78 79 } 80 81 /* 82 83 IO异常的处理 84 85 */ 86 87 public class FileOutputStreamDemo3{ 88 89 public static void main(String[] args){ 90 91 File file = new File("c:\\a.txt"); 92 93 //定义FileOutputStream的引用 94 95 FileOutputStream fos = null; 96 97 try{ 98 99 //创建FileOutputStream对象 100 101 fos = new FileOutputStream(file); 102 103 //写出数据 104 105 fos.write("abc".getBytes()); 106 107 }catch(IOException e){ 108 109 System.out.println(e.toString() + "------"); 110 111 }finally{ 112 113 //一定要判断fos是否为null,只有不为null时,才可以关闭资源 114 115 if(fos != null){ 116 117 try{ 118 119 fos.close(); 120 121 }catch(IOException e){ 122 123 throw new RuntimeException(""); 124 125 } 126 127 } 128 129 } 130 131 } 132 133 } 134 135 /* 136 137 字节输入流:InputStream 138 139 InputStream是抽象类,表示字节输入流的所有类的超类 140 141 abstract int read()从输入流中读取数据的下一个字节 142 143 int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中 144 145 FileInputStream类即文件输入流 146 147 abstract int read()从输入流中读取数据的下一个字节 148 149 */ 150 151 public class FileInputStreamDemo{ 152 153 public static void main(String[] args){ 154 155 File file = new File("c:\\a.txt"); 156 157 //创建一个字节输入流对象,必须明确数据源,其实就是创建字节读取和数据源相关联 158 159 FileInputStream fis = new FileInputStream(file): 160 161 //读取数据,一次读一个字节 162 163 int ch = 0; 164 165 while((ch = fis.read()) != -1){ 166 167 System.out.println( "ch=" + (char)ch); 168 169 } 170 171 //关闭资源 172 173 fis.close(); 174 175 } 176 177 } 178 179 /* 180 181 读取数据read(byte[] b) 182 183 */ 184 185 public class FileInputStreamDemo2{ 186 187 public static void main(String[] args){ 188 189 File file = new File("c:\\a.txt"); 190 191 //创建一个字节输入流对象,必须明确数据源,其实就是创建字节读取和数据源相关联 192 193 FileInputStream fis = new FileInputStream(file); 194 195 //创建一个字节数组 196 197 byte[] b = new byte[1024];//长度可以定义成1024的整数倍 198 199 int len = 0; 200 201 while((len = fis.read(b)) != -1){ 202 203 System.out.println(new String(b , 0 , len)); 204 205 } 206 207 fis.close(); 208 209 } 210 211 } 212 213 /* 214 215 复制文件: 读取一个已有的数据, 并将这些读到的数据写入到另一个文件中 216 217 */ 218 219 public class CopyFileTest{ 220 221 public static void main(String[] args){ 222 223 //明确源和目的 224 225 File srcFile = new File("c:\\a.txt"); 226 227 File destFile = new File("d:\\a,txt"); 228 229 //明确字节流 输入流和源相关联,输出流和目的关联 230 231 FileInputStream fis = new FileInputStream(srcFile); 232 233 FileOutputStream fos = new FileOutputStream(destFile); 234 235 //使用输入流的读取方法读取字节,并将字节写入到目的中 236 237 int ch = 0; 238 239 while((ch = fis.read()) != -1){ 240 241 fos.write(ch); 242 243 } 244 245 //关闭资源 246 247 fos.close(); 248 249 fis.close(); 250 251 } 252 253 } 254 255 /* 256 257 缓冲区方式复制文件 258 259 */ 260 261 public class CopyFileByBufferTest{ 262 263 public static void main(String[] args){ 264 265 //明确源和目的 266 267 File srcFile = new File("c:\\a.txt"); 268 269 File destFile = new File("d:\\a,txt"); 270 271 //明确字节流 输入流和源相关联,输出流和目的关联 272 273 FileInputStream fis = new FileInputStream(srcFile); 274 275 FileOutputStream fos = new FileOutputStream(destFile); 276 277 //定义一个缓冲区 278 279 byte[] buf = new byte[1024]; 280 281 int len = 0; 282 283 while((len = fis.read(b)) != -1){ 284 285 fos.write(buf , 0 , len);//将数组中的指定长度的数据写入到输出流中 286 287 } 288 289 //关闭资源 290 291 fos.close(); 292 293 fis.close(); 294 295 } 296 297 } 298 299 300 301 /* 302 303 字符流: 304 305 字符输入流: Reader,读取字符流的抽象超类 306 307 int read()读取单个字符 308 309 int read(char[] cbuf)将字符读入数组 310 311 FileReader类: 312 313 FileReader(File file)在给定从中读取数据的File的情况下创建一个新FileReader 314 315 FileReader(String fileName)在给定从中读取数据的文件名的情况下创建一个新FileReader 316 317 */ 318 319 //字节流读取字符的问题 320 321 public class CharStreamDemo{ 322 323 public static void main(String[] args) throws IOException{ 324 325 //读取文件中的中文 326 327 readCNTest(); 328 329 //给文件中写中文 330 331 writeCNTest(); 332 333 } 334 335 //读取中文 336 337 public static void readCNTest() throws IOException{ 338 339 FileInputStream fis = new FileInputStream("c:\\a.txt"); 340 341 int ch = 0; 342 343 while((ch = fis.read) != -1){ 344 345 System.out.println(ch); 346 347 } 348 349 } 350 351 //写中文 352 353 public static void writeCNTest() throws IOException{ 354 355 FileOutputStream fos = new FileOutputStream("c:\\a.txt"); 356 357 fos.write("你好".getBytes()); 358 359 fos.close(); 360 361 } 362 363 } 364 365 //FileReader读取包含中的文件 366 367 public class CharStreamDemo2{ 368 369 public static void main(String[] args) throws IOException{ 370 371 //读取文件中的中文 372 373 readCNTest(); 374 375 //给文件中写中文 376 377 writeCNTest(); 378 379 } 380 381 //读取中文 382 383 public static void readCNTest() throws IOException{ 384 385 FileInputStream fis = new FileInputStream("c:\\a.txt"); 386 387 int ch = 0; 388 389 while((ch = fis.read) != -1){ 390 391 //输出的字符对应的编码值 392 393 System.out.println(ch); 394 395 //输出字符本身 396 397 System.out.println((char)ch); 398 399 } 400 401 } 402 403 //写中文 404 405 public static void writeCNTest() throws IOException{ 406 407 FileOutputStream fos = new FileOutputStream("c:\\a.txt"); 408 409 fos.write("你好".getBytes()); 410 411 fos.close(); 412 413 } 414 415 } 416 417 /* 418 419 字符输出流Writer:写入字符流的抽象超类 420 421 void write(char[] cbuf)写入字符数组 422 423 abstract void write(char[] cbuf , int off , int len)写入字符数组的某一部分 424 425 void write(int c)写入单个字符 426 427 void write(String str)写入字符串 428 429 void write(String str , int off , int len)写入字符串的某一部分 430 431 FileWriter类: 432 433 FileWriter(File file)根据给定的File对象构造一个FileWriter对象 434 435 FileWriter(File file , boolean append)根据给定的File对象构造一个FileWriter对象 436 437 FileWriter(String fileName)根据给定的文件名构造一个FileWriter对象 438 439 FileWriter(String fileName , boolean append)根据给定的文件名及指示是否附加写入数据的boolean值来构造FileWriter对象 440 441 */ 442 443 public class FileWriterDemo{ 444 445 public static void main(String[] args){ 446 447 FileWriter fw = new FileWriter("c:\\a.txt"); 448 449 fw.write("你好"); 450 451 fw.flush(); 452 453 fw.close(); 454 455 } 456 457 } 458 459 /* 460 461 flush()和close()区别: 462 463 abstract void close()关闭流 , 但要先刷新 464 465 abstract void flush()刷新该流的缓冲 466 467 flush():将流中的缓冲区的数据刷新到目的地中,刷新后, 流还可以继续使用 468 469 close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流, 470 471 流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭 472 473 */