代码在转换为字符串 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() 来创建一个新的字符串。