java io 教程
Java解决java.io.FileNotFoundException写文件时候提示“系统。。。

Java解决java.io.FileNotFoundException写⽂件时候提⽰“系统。
⼀、问题在使⽤FileInputStream时会遇到如下问题1和问题2。
问题1:1.java.io.FileNotFoundException: .\xxx\xxx.txt (系统找不到指定的路径。
)问题2:1.java.io.FileNotFoundException: .\xx\xx.txt (拒绝访问。
)⼆、分析当遇到问题时,的确是当前所指定的⽂件不存在或者⽬录不存在。
当遇到第⼆个问题时,是因为你访问了⼀个⽂件⽬录,⽽不是⽂件,因此会抛出问题2的异常。
三、解决办法第⼀个的解决办法是,先判断⼀下当前⽂件是否存在,如果存在则略过,如果不存在,在创建,具体做法如下//在填写⽂件路径时,⼀定要写上具体的⽂件名称(xx.txt),否则会出现拒绝访问。
File file = new File("./mywork/work.txt");if(!file.exists()){//先得到⽂件的上级⽬录,并创建上级⽬录,在创建⽂件file.getParentFile().mkdir();try {//创建⽂件file.createNewFile();} catch (IOException e) {e.printStackTrace();}}第⼆个的解决办法是,在填写⽂件的路径时⼀定要具体到⽂件,如下:File file = new File("./mywork/work.txt");⽽不能写成:File file = new File("./mywork/");因为这样你访问的是⼀个⽬录,因此就拒绝访问。
java数字图像处理基础使用imageio写图像文件示例

java数字图像处理基础使⽤imageio写图像⽂件⽰例⼀个BufferedImage的像素数据储存在Raster中,ColorModel⾥⾯储存颜⾊空间,类型等信息,当前Java只⽀持⼀下三种图像格式- JPG,PNG,GIF,如何向让Java⽀持其它格式,⾸先要完成Java中的图像读写接⼝,然后打成jar,加上启动参数-Xbootclasspath/pnewimageformatIO.jar即可。
Java中如何读写⼀个图像⽂件,使⽤ImageIO对象即可。
读图像⽂件的代码如下:复制代码代码如下:File file = new File("D:\\test\\blue_flower.jpg");BufferedImage image = ImageIO.read(file);写图像⽂件的代码如下:复制代码代码如下:File outputfile = new File("saved.png");ImageIO.write(bufferedImage, "png",outputfile);从BufferedImage对象中读取像素数据的代码如下:复制代码代码如下:int type= image.getType();if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )return (int [])image.getRaster().getDataElements(x, y, width, height, pixels );elsereturn image.getRGB( x, y, width, height, pixels, 0, width );⾸先获取图像类型,如果不是32位的INT型数据,直接读写RGB值即可,否则需要从Raster对象中读取。
java中的imageio.write 用法

java中的imageio.write 用法imageio.write() 是Java 中用于将图像数据写入图像文件的方法。
它允许开发人员将图像数据以不同的格式(例如JPEG、PNG、BMP等)保存到本地磁盘上的文件中。
imageio.write() 方法的使用方法如下:javapublic static boolean write(RenderedImage im, String formatName, File output) throws IOException {ImageWriter writer = null;ImageOutputStream ios = null;try {根据格式名称获取合适的图像写入器Iterator<ImageWriter> writers =ImageIO.getImageWritersByFormatName(formatName);if (!writers.hasNext()) {throw new UnsupportedOperationException("Unsupported image format: " + formatName);}writer = writers.next();创建图像输出流ios = ImageIO.createImageOutputStream(output);writer.setOutput(ios);设置压缩参数ImageWriteParam param = writer.getDefaultWriteParam();if (formatName.equalsIgnoreCase("JPEG") formatName.equalsIgnoreCase("JPG")) {param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);param.setCompressionQuality(0.8f);}写入图像文件writer.write(null, new IIOImage(im, null, null), param);return true;} finally {关闭资源if (writer != null) {writer.dispose();}if (ios != null) {ios.close();}}}上述代码展示了一个基本的使用imageio.write() 方法保存图像的示例。
用javaimageio调整图片DPI,例如从96调整为300

⽤javaimageio调整图⽚DPI,例如从96调整为300因项⽬需求把图⽚的DPI值提升到300,否则OCR识别产⽣错乱:直接上源码:1、图⽚处理接⼝:package util.image.dpi;import java.awt.image.BufferedImage;import java.io.IOException;/*** 图⽚处理接⼝设计* @author jffan**/public interface ImageDPIProcessor {/*** 根据⽂件后缀扩展名判断是否能进⾏处理* @param fileName* @return*/public boolean canHandle(String fileName);/*** 处理图⽚,设置图⽚DPI值* @param path* @param dpi dot per inch* @return* @throws IOException*/public byte[] process(final BufferedImage srcimage, final int dpi) throws Exception;}2、JEPG图⽚的实现类package util.image.dpi;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.Iterator;import javax.imageio.IIOImage;import javax.imageio.ImageIO;import javax.imageio.ImageTypeSpecifier;import javax.imageio.ImageWriteParam;import javax.imageio.ImageWriter;import javax.imageio.metadata.IIOMetadata;import javax.imageio.stream.ImageOutputStream;import org.w3c.dom.Element;/*** JPEG 处理⽅式* @author jffan**/public class JpegDPIProcessor implements ImageDPIProcessor {private String formatName = "jpeg";/*** 处理图⽚,设置图⽚DPI值* @param path* @param dpi dot per inch* @return* @throws IOException*/@Overridepublic byte[] process(BufferedImage image, int dpi) throws IOException {for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName(formatName); iw.hasNext();) {ImageWriter writer = iw.next();ImageWriteParam writeParams = writer.getDefaultWriteParam();writeParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);//调整图⽚质量writeParams.setCompressionQuality(1f);IIOMetadata data = writer.getDefaultImageMetadata(new ImageTypeSpecifier(image), writeParams);Element tree = (Element) data.getAsTree("javax_imageio_jpeg_image_1.0");Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);jfif.setAttribute("Xdensity", dpi + "");jfif.setAttribute("Ydensity", dpi + "");jfif.setAttribute("resUnits", "1"); // density is dots per inchByteArrayOutputStream out = new ByteArrayOutputStream();ImageOutputStream stream = null;try {stream = ImageIO.createImageOutputStream(out);writer.setOutput(stream);writer.write(data, new IIOImage(image, null, null), writeParams);} finally {stream.close();}return out.toByteArray();}return null;}/*** 根据⽂件后缀扩展名判断是否能进⾏处理* @param fileName* @return*/@Overridepublic boolean canHandle(String fileName) {assert fileName != null : "fileName should not be null";return fileName.endsWith("jpg") || fileName.endsWith("jpeg") || fileName.endsWith("JPG") || fileName.endsWith("JPEG");}} 3、PNG图⽚的实现类package util.image.dpi;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.IOException;import .MalformedURLException;import java.util.Iterator;import javax.imageio.IIOImage;import javax.imageio.ImageIO;import javax.imageio.ImageTypeSpecifier;import javax.imageio.ImageWriteParam;import javax.imageio.ImageWriter;import javax.imageio.metadata.IIOInvalidTreeException;import javax.imageio.metadata.IIOMetadata;import javax.imageio.metadata.IIOMetadataNode;import javax.imageio.stream.ImageOutputStream;/*** PNG图⽚的实现类* @author jffan**/public class PngDPIProcessor implements ImageDPIProcessor {/*** 1英⼨是2.54⾥⾯*/private static final double INCH_2_CM = 2.54d;/*** 根据⽂件后缀扩展名判断是否能进⾏处理* @param fileName* @return*/@Overridepublic boolean canHandle(String fileName) {assert fileName != null : "fileName should not be null";return fileName.endsWith("png") || fileName.endsWith("PNG");}/*** 处理图⽚,设置图⽚DPI值* @param path* @param dpi dot per inch* @return* @throws IOException*/@Overridepublic byte[] process(BufferedImage image, int dpi) throws MalformedURLException, IOException {for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName("png"); iw.hasNext();) {ImageWriter writer = iw.next();ImageWriteParam writeParam = writer.getDefaultWriteParam();ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB); IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {continue;}ByteArrayOutputStream output = new ByteArrayOutputStream();ImageOutputStream stream = null;try {setDPI(metadata, dpi);stream = ImageIO.createImageOutputStream(output);writer.setOutput(stream);writer.write(metadata, new IIOImage(image, null, metadata), writeParam);} finally {try {stream.close();} catch (IOException e) {}}return output.toByteArray();}return null;}/*** 设置图⽚的DPI值* @param metadata* @param dpi* @throws IIOInvalidTreeException* @author 范继峰* @date 2019年7⽉30⽇上午10:53:18* @return void*/private void setDPI(IIOMetadata metadata, int dpi) throws IIOInvalidTreeException {// for PMG, it's dots per millimeterdouble dotsPerMilli = 1.0 * dpi / 10 / INCH_2_CM;IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");horiz.setAttribute("value", Double.toString(dotsPerMilli));IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");vert.setAttribute("value", Double.toString(dotsPerMilli));IIOMetadataNode dim = new IIOMetadataNode("Dimension");dim.appendChild(horiz);dim.appendChild(vert);IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");root.appendChild(dim);metadata.mergeTree("javax_imageio_1.0", root);}}。
Java NIO库基础:Channel、Buffer与Selector详解

Java NIO库基础:Channel、Buffer与Selector详解Java NIO(New Input/Output)库提供了一种非阻塞I/O操作的方式,相比于传统的Java I/O库,NIO提供了更高效的I/O操作模式。
NIO库是Java 1.4引入的,并且在后续版本中进行了不断的优化和改进。
在本文中,我们将详细解释Java NIO 库中的几个重要概念:Channel、Buffer和Selector。
ChannelChannel是NIO库中的核心概念之一。
Channel表示一个打开的连接,可以进行读取或写入。
与传统的I/O库中的InputStream和OutputStream不同,Channel是双向的,即可以同时进行读取和写入操作。
NIO库中常用的Channel包括: - FileChannel:用于文件操作的Channel。
- SocketChannel:用于套接字连接的Channel。
- ServerSocketChannel:用于监听新进来的TCP连接的Channel。
- DatagramChannel:用于UDP连接的Channel。
Channel的基本操作包括读取数据、写入数据和关闭Channel。
使用Channel进行读取和写入数据时,通常需要配合Buffer对象。
BufferBuffer是NIO库中用于存储数据的缓冲区。
在Channel和Buffer之间进行数据交互。
Buffer有以下几个重要的属性: - capacity:缓冲区的容量,即可以存储的数据的最大量。
- position:当前的位置,表示下一个要读取或写入的元素的索引。
- limit:限制缓冲区中可操作的数据的末尾位置。
- mark:标记位置,用于在某些情况下进行复位操作。
Buffer类的常用子类包括: - ByteBuffer - CharBuffer - ShortBuffer - IntBuffer - LongBuffer - FloatBuffer - DoubleBuffer使用Buffer进行读取和写入数据时,需要首先获取Buffer对象,并对其进行适当的初始化。
java中的imageio.write 用法

一、介绍1. 定义在Java编程语言中,imageio.write是一个用于将图像数据写入文件或其他输出流的方法。
2. 作用imageio.write的作用是将图像数据保存为各种不同格式的文件,比如JPEG、PNG、BMP等。
它可以将内存中的图像数据转换为特定格式的图像文件,并保存到磁盘上或者通过网络传输出去。
3. 应用场景imageio.write广泛应用于开发需要图像处理和图像保存功能的Java应用程序中,比如图片编辑软件、图像处理工具、网页设计应用等。
二、基本语法1. 方法签名imageio.write方法的基本语法如下:public static boolean write(RenderedImage im, String formatName, ImageOutputStream output)throws IOException在这个方法签名中,im是待写入文件的图像对象,formatName指定了要写入的图像格式(比如JPEG、PNG、BMP),output则是用于输出的流对象。
2. 返回值imageio.write方法返回一个boolean值,指示写入操作是否成功。
3. 异常处理在使用imageio.write方法时,需要处理可能抛出的IOException异常。
三、示例代码1. 保存为JPEG格式```javaimport javax.imageio.ImageIO;import java.io.File;import java.io.IOException;import java.awt.image.BufferedImage;public class ImageIOExample {public static void m本人n(String[] args) {BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);File outputfile = new File("saved.jpg");try {ImageIO.write(image, "jpg", outputfile);} catch (IOException e) {System.out.println("Error: " + e);}}}```2. 保存为PNG格式```javaimport javax.imageio.ImageIO;import java.io.File;import java.io.IOException;import java.awt.image.BufferedImage;public class ImageIOExample {public static void m本人n(String[] args) {BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);File outputfile = new File("saved.png");try {ImageIO.write(image, "png", outputfile);} catch (IOException e) {System.out.println("Error: " + e);}}}```四、注意事项1. 格式名称在使用imageio.write方法时,需要确保指定的格式名称是正确的,比如JPEG格式对应"jpg",PNG格式对应"png",否则会导致写入失败。
Java.io.File中的delete()方法和deleteOnExit()方法的区别
Java.io.File中的delete()⽅法和deleteOnExit()⽅法的区别1.delete()⽅法:当调⽤delete()⽅法时,直接删除⽂件,不管该⽂件是否存在,⼀经调⽤⽴即执⾏;2.deleteOnExit()⽅法:当调⽤deleteOnExit()⽅法时,只是相当于对deleteOnExit()作⼀个声明,当程序运⾏结束,JVM终⽌时才真正调⽤deleteOnExit()⽅法实现删除操作。
即该⽅法是将删除的命令缓存了⼀下,到服务停⽌的时候再进⾏操作!⽰例:@Testpublic void test() throws IOException{File file=new File("E:"+File.separator+"filetest"+File.separatorChar+"HelloFile.txt");if(file.exists()){file.deleteOnExit();file.createNewFile();}else{("不存在该⽂件");}}测试结果:在相应的位置HelloFile.txt 不存在(被删除掉了);因为此处的deleteOnExit()是在JVM退出的时候才执⾏的,因此相当于是先调⽤了createNewFile()再调⽤deleteOnExit();@Testpublic void test() throws IOException{File file=new File("E:"+File.separator+"filetest"+File.separatorChar+"HelloFile.txt");if(file.exists()){file.delete();file.createNewFile();}else{("不存在该⽂件");}}测试结果:在相应的位置HelloFile.txt 仍存在(被删除掉后⼜建⽴⼀个新的该⽂件);因为此处先调⽤了delete()再调⽤createNewFile()。
java.io.IOException:Streamclosed解决办法
java.io.IOException:Streamclosed解决办法1.出现这个bug的⼤体逻辑代码如下:1private static void findMovieId() throws Exception {2 File resultFile = new File("C:\\2016.txt");34 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(resultFile));5 BufferedWriter bufferWriter = new BufferedWriter(outputStreamWriter);67 outputStreamWriter.close();8 bufferWriter.close();9 }2.报错⼤体信息如下:3.解决⽅式:原因:bufferwriter流使⽤了outputStreamWriter流,所以关闭bufferwriter流也会关闭outputStreamWriter流;但是下⾯有使⽤outputStreamWriter 流,相当于使⽤⼀个关闭了的流。
解决办法是换下位置就可以了.代码改为:private static void findMovieId() throws Exception {File resultFile = new File("C:\\2016.txt");OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(resultFile));BufferedWriter bufferWriter = new BufferedWriter(outputStreamWriter);bufferWriter.close();outputStreamWriter.close();}同理:FileWriter和BufferWriter之间的关系:FileWriter fileWriter=new FileWriter(file);BufferWriter bufferWriter=new BufferedWriter(fileWriter);这⾥关闭流要从⼤到⼩关闭,BufferWriter包装了FileWriter,BufferWriter"⼤",FileWriter"⼩"FileWriter.close();BufferWriter.close();这样的顺序就是不⾏,FileWriter流⾃⼰关闭了。
java.io.IOException:你的主机中的软件中止了一个已建立的连接。
button在internetபைடு நூலகம்xplorer的默认类型是button而其他浏览器中包括w3c规范的默认值是submit
java.io.IOExcept ion:你的主机中的软件中止了一个已建立的连接。 1、异常表现:我在jsp文件中有一个<form>表单,里面有一个<button>保存事件按钮。<button onclick="addOrUPdate()">保存</button> onclick的js函数里我是用ajax提交的数据,用于局部刷新页面。 2、问题原因:<button>在Internet Explorer 的默认类型是 "button",而其他浏览器中(包括 W3C 规范)的默认值是 "submit"。 所以导致了表单重复提交。出现“java.io.IOException: 你的主机中的软件中止了一个已建立的连接”异常。 3、问题解决:把代码 改为<button type="button" onclick="addOrUPdate()">保存</button>,为<button>按钮定义Type属性为button。
Java线程和IO总结
//接着来创建一个线程类对象
public static void main(String[] args){ Thread t1 = new ThreadA(); //创建一个 t1 线程
Runnable r = new MyRunnable(); //创建一个 Runnable 的实例 r Thread t2 = new Thread(r); //使用一个 Runnable 的实例来创建一个线程 t2
进程的调度: 进程的调度是由 OS 负责的(有的系统为独占式,有的系统为共享式,根据重要性,进
程有优先级)。由 OS 将时间分为若干个时间片,调度系统把每个时间片分给多个进程,而 线程也是类似的。JAVA 在语言级支持多线程。负责分配时间的仍然是 OS。性能调优是根 据时间片划分,时间片会影响整个操作系统。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。 注意 这三个方法都是 ng.Ojbect 的方法! setDeamon(true) 设置线程为后台运行
6.JDK5.0 多线程
新的并发包 java.util.concurrent 实现了线程与业务的分离! 让线程资源不断地重用。
线程的同步 用法一:
synchronized(o){ 原子操作代码块
(同步代码块)
}
哪个线程能拿到 o 的锁标记,哪个线程才能进入这个同步代码块, 等到出了代码块后才释放锁标记。 未加同步可能造成数据不一致和数据不完整的缺陷。
用法二:
public synchronized void method(){ …}
为了让某些工作并行,在 JVM 进程的主线程中开辟多个线程,线程并发执行是一个宏 观概念,微观上是串行的。这就是线程的机制。