System.in是BufferedInputStream的对象
时间: 2024-02-02 17:58:49 浏览: 20
不完全正确。System.in是一个标准输入流,它的类型是InputStream。在Java中,InputStream是一个抽象类,它提供了读取输入流的基本方法,例如read()和read(byte[] b)。BufferedInputStream是InputStream的一个具体子类,它提供了带缓冲的读取方法,可以更高效地读取数据。当你需要对输入流进行缓冲时,可以将其封装在BufferedInputStream中。因此,你可以使用BufferedInputStream来包装System.in,以便更高效地读取标准输入流中的数据。
相关问题
File file = new File("net-app\\src\\com\\itheima\\d10\\16-扩展案例-群聊.mp4"); System.out.println(file.length()); Scanner sc=new Scanner(System.in); String s = sc.nextLine(); FileInputStream fileInputStream = new FileInputStream(file); BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); Socket socket = new Socket("127.0.0.1",10086); OutputStream outputStream = socket.getOutputStream(); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); byte[] bytes=new byte[1024*8]; int read; while ((read = bufferedInputStream.read(bytes))!=-1){ System.out.println(read); bufferedOutputStream.write(bytes,0,read); } bufferedInputStream.close(); bufferedOutputStream.close();
这段代码是一个简单的网络文件传输的客户端代码。该代码首先创建一个File对象,指定要传输的文件路径,并使用length()方法获取该文件的大小。然后通过Scanner类等待用户输入任意字符,进一步控制文件传输操作的进行。接下来使用FileInputStream获取该文件的输入流,再通过BufferedInputStream包装一下,就可以读取文件内容了。然后创建一个Socket对象,连接到指定的服务器IP地址和端口号(这里是127.0.0.1:10086),并通过Socket的getOutputStream()方法获取输出流,再通过BufferedOutputStream包装一下,就可以将读取到的文件内容写入到Socket的输出流中,实现文件的传输。需要注意的是,这个代码只能传输小文件,如果传输的文件较大,则需要采用分段传输的方式,否则会发生内存溢出。
这段代码会导致F:\detailsZIP\cccccnew.zip: 另一个程序正在使用此文件,进程无法访问。这个问题吗; List<UnzipFileVo> vos = new ArrayList<>(); ZipFile zip = null; InputStream in = null; try { if (Objects.isNull(file)) { // if (Objects.isNull(file) || !file.exists()) { return Collections.emptyList(); } //ZipFile zip = new ZipFile(file); //F:\detailsZIP\有文本.zip zip = new ZipFile(file, Charset.forName("GBK"));//解决中文乱码 if (Objects.isNull(zip)) { return Collections.emptyList(); } ZipFile zf = new ZipFile(file); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); ZipInputStream zis = new ZipInputStream(bis); ZipEntry ze; while((ze=zis.getNextEntry()) != null){ if(ze.isDirectory()){ System.out.println("这是目录"); }else{ UnzipFileVo vo = new UnzipFileVo(); if(ze.getName().endsWith(".png")){ vo = parseName(ze.getName(), ze, vo); }else if(ze.getName().endsWith(".jpg")){ vo = parseName(ze.getName(), ze, vo); } in = zip.getInputStream(ze); MultipartFile multipartFile = getMultipartFile(in, System.currentTimeMillis() + ".png"); vo.setMultipartFile(multipartFile); vos.add(vo); } } } catch (Exception e) { e.printStackTrace(); if (Objects.nonNull(e)) { throw new ServiceException("文件有误,请重新上传!"); } else { Integer code = ((CheckedException) e).getCode(); if (Objects.equals(code, 201)) { throw new CheckedException(e.getMessage()); } } } finally { if (Objects.nonNull(zip)) { try { zip.close(); } catch (IOException e) { e.printStackTrace(); } } if (Objects.nonNull(in)) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } //强制清空原来的文件 FileUtil.clean(zipPath); } return vos;
这段代码中使用了ZipFile和InputStream来读取压缩文件的内容,但是在finally块中并没有关闭这些资源。如果在读取文件过程中出现异常,这些资源将不会被关闭,可能会导致文件被占用,造成后续的操作失败。
另外,代码中使用了两次ZipFile来打开同一个压缩文件,这是不必要的。
建议对代码进行如下修改:
```java
List<UnzipFileVo> vos = new ArrayList<>();
ZipFile zip = null;
try {
if (Objects.isNull(file) || !file.exists()) {
return Collections.emptyList();
}
zip = new ZipFile(file, Charset.forName("GBK"));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
ZipInputStream zis = new ZipInputStream(bis);
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null) {
if (ze.isDirectory()) {
System.out.println("这是目录");
} else {
UnzipFileVo vo = new UnzipFileVo();
if (ze.getName().endsWith(".png") || ze.getName().endsWith(".jpg")) {
vo = parseName(ze.getName(), ze, vo);
InputStream in = zip.getInputStream(ze);
MultipartFile multipartFile = getMultipartFile(in, System.currentTimeMillis() + ".png");
vo.setMultipartFile(multipartFile);
vos.add(vo);
}
}
}
} catch (Exception e) {
e.printStackTrace();
throw new ServiceException("文件有误,请重新上传!");
} finally {
if (Objects.nonNull(zip)) {
try {
zip.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//强制清空原来的文件
FileUtil.clean(zipPath);
}
return vos;
```
在修改后的代码中,只使用了一次ZipFile来打开压缩文件,并且在finally块中关闭了ZipFile和InputStream。同时,只有当文件名以".png"或".jpg"结尾时,才会读取该文件的内容并将其转换成MultipartFile对象。