Skip to content
Advertisement

Code taking forever to excute when turned to string Java? [closed]

When I change the String m1 to a 2D int array it runs super fast but now it takes over an hour to just loop 10 pictures also each picture takes almost double the time the first one took . Is there a way where I can improve my code so it runs faster as I need to save all values as one String in the end ?

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);
    }
}

Advertisement

Answer

Your understanding of string performance may be the issue.

Strings are immuttable, so every change to a string makes a new String, it doesn’t alter the existing string.

if (m1=="") {
    m1=(red+":"+green+":"+blue);
    System.out.println(m1);
} else {
    m1=m1+":"+red+":"+green+":"+blue;
}

doesn’t create one string. It creates a string for the red value, then creates a string that containts that in addition to a “:”, and then creates a string that contains that in addition to the green value, and then creates a string that contains that in addition to the …. (and so on)

So instead use a StringBuilder, which is like a buffer of RAM that holds String contents which can be manipulated without creating new Strings. When you want the String value for the buffer, call .toString() to create a new String.

2 People found this is helpful
Advertisement