Импорт файла jar с дефисами [duplicate]

Принятый и поддержанный ответ может работать, но он субоптимален и довольно расточителен:

  1. Если изображение для сохранения находится на диске, нет никаких оснований использовать элемент управления пользовательского интерфейса и a MemoryStream, чтобы получить изображение в массив байтов.
  2. Код также повторяет использование одного глобального объекта соединения; они должны быть созданы и утилизированы, а не повторно использованы.
  3. Рассмотрите возможность сохранения только имени файла в базе данных, возможно, хэшированного изображения, сохраненного в специальной папке. Сохранение данных изображения раздувает DB и занимает больше времени для преобразования.
  4. Наконец, .GetBuffer() совершенно неверно: буфер memstream часто включает неиспользуемые, выделенные байты. С тестовым файлом 25k ToArray() возвращает 25434 байта - правильный размер изображения, в то время как GetBuffer() возвращает 44416. Чем больше изображение, тем больше будет пустых байтов.

Это использует объекты поставщика MySQL, так как он имеет такую ​​метку, но используемый поставщик данных (MySQL, SQLServer, OleDB и т. д.) не имеет значения: все они работают одинаково.

В случаях, когда источником изображения является PictureBox, используйте MemoryStream:

Dim picBytes As Byte()
Using ms As New MemoryStream()
    picBox1.Image.Save(ms, imgFormat)
    picBytes = ms.ToArray()        ' NOT GetBuffer!
End Using

. Поскольку изображение должно было откуда-то прибыть, если это файл, это все, что вам нужно:

picBytes = File.ReadAllBytes(filename)

Как только у вас есть изображение в виде байтов, чтобы сохранить:

Dim SQL = "INSERT INTO  (picture, filename, filesize) VALUES(@Pic, @FileName, @FileSize)"

Using conn As New MySqlConnection(connstr)
    Using cmd As New MySqlCommand(SQL, conn)
        conn.Open()

        cmd.Parameters.Add("@Pic", MySqlDbType.Blob).Value = picBytes
        cmd.Parameters.Add("@FileName", MySqlDbType.String).Value = filename
        cmd.Parameters.Add("@FileSize", MySqlDbType.Int32).Value = FileSize

        cmd.ExecuteNonQuery()

    End Using
End Using            ' close and dispose of Connection and Command objects

Загрузка изображения из БД

Dim imgData As Byte()

'... open connection, set params etc
Using rdr As MySqlDataReader = cmd.ExecuteReader

    If rdr.HasRows Then
        rdr.Read()
        imgData = TryCast(rdr.Item("Image"), Byte())
        ' in case this record has no image
        If imgData IsNot Nothing Then
             ' ToDo: dispose of any previous Image

            ' create memstream from bytes
            Using ms As New MemoryStream(imgData)
                ' create image from stream, assign to PicBox
                picBox1.Image = CType(Image.FromStream(ms), Image)

            End Using
        End If
    End If
End Using

Примечание что Bitmaps и Images должны быть удалены. Если вы повторно создаете новые изображения, когда пользователь просматривает базу данных, ваше приложение будет течь и в конечном итоге сбой. Если вы много конвертируете назад, вы можете написать вспомогательный или дополнительный метод для преобразования изображений в байты и наоборот.

DBConnection и DBCommand объекты также должны быть удалены. Блок Using делает это для нас.

Ссылки, ресурсы:

0
задан KTF 8 September 2014 в 18:45
поделиться

4 ответа

После добавления jar в путь сборки проектов вы можете импортировать классы специально, или вы можете импортировать пакеты класса Java. См. Следующие два примера.

Предположим, вы хотите использовать некоторые функции класса Scanner в своем классе. Затем вам нужно импортировать класс Scanner в свой класс (помните, что в том же пакете есть класс других классов в классе Scanner).

Чтобы импортировать класс сканера специально из пакета util, вы можете использовать следующие синтаксис.

import java.util.Scanner;

Это импортирует только класс Scanner из пакета util и позволяет использовать функции класса Scanner.

Чтобы импортировать все классы в пакете util, вы можете используйте следующий синтаксис

import java.util.*;

Это приведет к импорту всех классов в пакете util, и вам будет разрешено использовать любую функциональность из любого класса вашего класса (а не только из класса Scanner).

Второй метод называется wildcard import. Разница в производительности между конкретным импортом и декларацией импорта подстановочного знака.

Вы не можете импортировать файл .jar.

0
ответ дан Chathura Priyankara 26 August 2018 в 01:25
поделиться

Для этого вам нужно добавить его в путь к классам при компиляции и запуске, например

java -cp myJar.jar a.b.myMainClass

или

javac -cp myJar.jar a/*

1
ответ дан ControlAltDel 26 August 2018 в 01:25
поделиться

Как только jar находится на пути класса выполнения, вы импортируете их в обычном режиме:

import the.package.and.name.of.TheClass;

Это связано с тем, что виртуальная машина Java имеет концепцию «пути к классу». Этот путь класса заполняется всеми файлами (классами и ресурсами), найденными в файлах jar и папках, размещенных в пути к классам.

Например, если у вас две jar и одна папка:

A.jar
  com/
    mycompany/
      A.class
      Another.class
B.jar
  com/
    mycompany/
      B.class
      neededImage.gif
bin-folder/
  org/
    apache/
      Something.class

Из JVM POV у вас есть сумма всех этих папок, как если бы они были в одной папке.

Таким образом, вы можете свободно импортировать любой класс, который вам нужен, указав полное имя, независимо, если он находится внутри банки или в папке bin проекта.

На самом деле банки - это не более чем zip-файлы из папок, содержащие скомпилированные классы (и, в конечном итоге, другие ресурсы).

Класс путь объявляется JVM при запуске программы, используя ключ командной строки «-cp». Например, для предыдущих двух банок и одной папки в окнах вы должны были бы написать:

java -cp A.jar;B.jar;bin-folder your.main.class.Here
0
ответ дан Simone Gianni 26 August 2018 в 01:25
поделиться

Вы импортируете классы, а не файлы jar, в исходный код Java.

Допустим, что у вас есть someJar.jar, который содержит определения классов для 3 классов, FirstClass.class, SecondClass.class и ThirdClass.class, все из которых находятся в пакете org.somepackage.

Учитывая вышеизложенное, вы должны добавить

import org.somepackage.FirstClass

в начало исходного файла, чтобы импортировать класс с именем FirstClass.

2
ответ дан Stephen C 26 August 2018 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: