这里直接把s赋值给readContent是有问题的,问题点如下:
假设文件有两行
第一行
第二行
则读取循环两次,第一次s赋值给readContent,readContent的值为 "第一行",然后又循环,读取第二行,再次赋值,则readContent就会变成 "第二行",第一行的值就丢失了;
这里StringBuff的作用是把读取到的内容连接起来成为一个字符串;
不过这里的例子的确有问题,问题却不在StringBuffer上,而在 s 变量上,s中间两步是不必要的,循环内直接改成如下形式:
删除s.getBytes()和new String
另外,除了以上问题,来总结下这段代码的问题吧:
1、文件资源没有释放
2、在不涉及多线程的情况下,应使用StringBuilder类进行字符串拼接,而不是StringBuffer,因为StringBuilder更快(但是StringBuilder线程不安全,StringBuffer线程安全);
3、异常处理有问题,如果出现IO异常,就返回异常信息的字符串?那么如何区分这个字符串是发生了异常还是从文件中读取到的内容呢?这里不应该返回字符串,而是直接声明异常,有异常就向外抛,直到能处理的顶层程序处理。
基于以上几点,修改代码如下:
注意第27行,声明本方法可能抛出 IOException 异常,稍后主程序将进行处理。另外注意第30行,创建InputStreamReader 的时候指定了文件编码为utf8,以避免乱码,你的文件如果存储的是其他编码类型,则会出现乱码。
调用代码如下:
getContent函数调用主程序
注意18行和21行,是分别处理正常情况和异常情况,当读取异常时,将会调用第21行,打印异常信息;
整体代码如下:
全部代码
接下来我们看看代码执行情况。
1、当我们要读的文件不存在时,执行结果如下:
我们要读的文件不存在时,抛出异常
看,当文件不存在时,抛出异常,并由异常处理程序捕获和打印,你可以看到具体哪一行代码出错[getContent(App.java:29)],说明在App.java 文件中的getContent方法,文件的29行出错。
2、那么正常情况下呢?当然是输出文件内容了,我们放一个有如下内容的文件在"D:\\file.txt"处:
要读取的文件内容
执行结果如下:
正常情况下,输出文件内容
最后,我不知道你看的是什么书,是不是课本,但感觉质量不高,这里给你推荐几本,可以买来看看:
1、Head First java
2、菜鸟教程 Java
3、最权威的,自然是The Java® Language Specificati了
祝你学习之路顺利
把图片按照规定的比例压缩,然后保存至FTP,列表读取缩略图,单击显示原图。
/*** 压缩图片方法一(高质量)
* @param oldFile 将要压缩的图片
* @param width 压缩宽
* @param height 压缩高
* @param smallIcon 压缩图片后,添加的扩展名(在图片后缀名前添加)
* @param quality 压缩质量 范围:<i>0.0-1.0</i> 高质量:<i>0.75</i> 中等质量:<i>0.5</i> 低质量:<i>0.25</i>
* @param percentage 是否等比压缩 若true宽高比率将将自动调整
*/
public static void compressImage(String oldFile, int width, int height, String smallIcon,
float quality, boolean percentage) {
try {
File file = new File(oldFile)
// 验证文件是否存在
if(!file.exists())
throw new FileNotFoundException("找不到原图片!")
// 获取图片信息
BufferedImage image = ImageIO.read(file)
int orginalWidth = image.getWidth()
int orginalHeight = image.getHeight()
// 验证压缩图片信息
if (width <= 0 || height <= 0 || !Pattern.matches("^[1-9]\\d*$", String.valueOf(width))
|| !Pattern.matches("^[1-9]\\d*$", String.valueOf(height)))
throw new Exception("图片压缩后的高宽有误!")
// 等比压缩
if (percentage) {
double rate1 = ((double) orginalWidth) / (double) width + 0.1
double rate2 = ((double) orginalHeight) / (double) height + 0.1
double rate = rate1 > rate2 ? rate1 : rate2
width = (int) (((double) orginalWidth) / rate)
height = (int) (((double) orginalHeight) / rate)
}
// 压缩后的文件名
String filePrex = oldFile.substring(0, oldFile.lastIndexOf('.'))
String newImage = filePrex + smallIcon + oldFile.substring(filePrex.length())
// 压缩文件存放位置
File savedFile = new File(newImage)
// 创建一个新的文件
savedFile.createNewFile()
// 创建原图像的缩放版本
Image image2 = image.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING)
// 创建数据缓冲区图像
BufferedImage bufImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
// 创建一个Graphics2D
Graphics2D g2 = bufImage.createGraphics()
// 重绘图像
g2.drawImage(image2, 0, 0, width, height, null)
g2.dispose()
// 过滤像素矩阵
float[] kernelData = {
-0.125f, -0.125f, -0.125f,
-0.125f, 2, -0.125f, -0.125f,
-0.125f, -0.125f }
Kernel kernel = new Kernel(3, 3, kernelData)
// 按核数学源图像边缘的像素复制为目标中相应的像素输出像素
ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null)
// 转换像素
bufImage = cOp.filter(bufImage, null)
FileOutputStream out = new FileOutputStream(savedFile)
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out)
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufImage)
// 设置压缩质量
param.setQuality(quality, true)
encoder.encode(bufImage, param)
out.close()
System.out.println(newImage)
} catch (Exception e) {
e.printStackTrace()
System.out.println("压缩失败!" + e.getMessage())
}
}
<img src="111.png" />引用的是同一目录下的,你上面那段代码根本就没输出到那个目录当然找不到了。 对于一个项目来说图片有个专有的文件夹存放,比如在WebRoot的imageFolder下,那么你在输出流写图片的时候要指定好这个相对路径,然后页面上用<img src="../imageFolder/111.png" />通常来说解决方案是这样的:以一个图片上传的例子为例,首先会在xml文件中配置好上传文件的绝对路径(例如C:/XXDX/XX这样,将来部署到服务器上时,修改配置文件路径就好了)然后比如我们上传的图片都是用输入流写到xx/xx/war/upload中 (我看你后增加的代码中没有flush(),是不对的) 然后在页面jsp中用/upload/xxx.png取值,之所以这么取是因为“/”是war根目录,当然你要是用"../"那种方式你要查明白你现在的目录级别。