代码在转换为字符串 Java 时永远执行?
Code taking forever to excute when turned to string Java?
当我将字符串 m1 更改为 2D int 数组时,它运行得非常快,但现在循环 10 张图片需要一个多小时,而且每张图片花费的时间几乎是第一张的两倍。有没有一种方法可以改进我的代码,使其运行得更快,因为我最终需要将所有值保存为一个字符串?
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.*;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.imageio.ImageIO;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.*;
import java.awt.Color;
import java.awt.image.BufferedImage;
public class Convertt {
static String[][] allImages = new String[304][76808];
static String m1 = "";
static int f = 0;
public static void rgb1(Path path) throws IOException {
File file = new File(String.valueOf(path));
BufferedImage img = ImageIO.read(file);
for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {
int pixel = img.getRGB(x, y);
Color color = new Color(pixel, true);
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
if (m1 == "") {
m1 = (red + ":" + green + ":" + blue);
System.out.println(m1);
} else {
m1 = m1 + ":" + red + ":" + green + ":" + blue;
}
}
}
f++;
System.out.println("Done with" + f);
}
public static void main(String[] args) throws IOException {
Path imgFolder = Paths.get("D:\swim\Frames1");
int k = 1;
for (int i = 0; i < 273; i++) {
rgb1(imgFolder.resolve("frames" + k + ".png"));
k++;
}
System.out.println("done");
FileWriter writer = new FileWriter("D:\swim\Output\new1.csv");
writer.append(m1);
}
}
您对字符串性能的理解可能是问题所在。
字符串是不可变的,因此对字符串的每次更改都会生成一个新字符串,不会改变现有字符串。
if (m1=="") {
m1=(red+":"+green+":"+blue);
System.out.println(m1);
} else {
m1=m1+":"+red+":"+green+":"+blue;
}
不创建一个字符串。它为红色值创建一个字符串,然后创建一个包含 ts 和“:”的字符串,然后创建一个包含绿色值的字符串,然后创建一个包含除“:”之外的字符串....(等等)
因此,请改用 StringBuilder,它类似于 RAM 缓冲区,用于保存无需创建新字符串即可对其进行操作的字符串内容。当您需要缓冲区的字符串值时,调用 .toString()
来创建一个新的字符串。
当我将字符串 m1 更改为 2D int 数组时,它运行得非常快,但现在循环 10 张图片需要一个多小时,而且每张图片花费的时间几乎是第一张的两倍。有没有一种方法可以改进我的代码,使其运行得更快,因为我最终需要将所有值保存为一个字符串?
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.*;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.imageio.ImageIO;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.*;
import java.awt.Color;
import java.awt.image.BufferedImage;
public class Convertt {
static String[][] allImages = new String[304][76808];
static String m1 = "";
static int f = 0;
public static void rgb1(Path path) throws IOException {
File file = new File(String.valueOf(path));
BufferedImage img = ImageIO.read(file);
for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {
int pixel = img.getRGB(x, y);
Color color = new Color(pixel, true);
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
if (m1 == "") {
m1 = (red + ":" + green + ":" + blue);
System.out.println(m1);
} else {
m1 = m1 + ":" + red + ":" + green + ":" + blue;
}
}
}
f++;
System.out.println("Done with" + f);
}
public static void main(String[] args) throws IOException {
Path imgFolder = Paths.get("D:\swim\Frames1");
int k = 1;
for (int i = 0; i < 273; i++) {
rgb1(imgFolder.resolve("frames" + k + ".png"));
k++;
}
System.out.println("done");
FileWriter writer = new FileWriter("D:\swim\Output\new1.csv");
writer.append(m1);
}
}
您对字符串性能的理解可能是问题所在。
字符串是不可变的,因此对字符串的每次更改都会生成一个新字符串,不会改变现有字符串。
if (m1=="") {
m1=(red+":"+green+":"+blue);
System.out.println(m1);
} else {
m1=m1+":"+red+":"+green+":"+blue;
}
不创建一个字符串。它为红色值创建一个字符串,然后创建一个包含 ts 和“:”的字符串,然后创建一个包含绿色值的字符串,然后创建一个包含除“:”之外的字符串....(等等)
因此,请改用 StringBuilder,它类似于 RAM 缓冲区,用于保存无需创建新字符串即可对其进行操作的字符串内容。当您需要缓冲区的字符串值时,调用 .toString()
来创建一个新的字符串。